You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向PostgreSQL表插入MAC地址字符串遇非空约束异常,求解决方案

问题描述

我使用一个带有mac-address字段的PostgreSQL表,希望构造INSERT语句插入编辑框中的MAC地址字符串。

SQL插入语句定义如下:

cInsertL2IfParams    : string = 'INSERT INTO tb_macaddresses(fmacaddr) ' +
                            'VALUES(pMyMACAddress::macaddr)';

随后编写代码创建参数并赋值:

mymacaddr := MainDM.MainSQLQ.Params.CreateParam(TFieldType.ftString,'pMyMACAddress',TParamType.ptInput);
mymacaddr.value := myedit.Text;

执行时抛出异常:

"Open" procedure rised exception: EPQDatabaseError... ...string contains NULL (10,null)
SQL State: 23502

但在pgAdmin中执行以下插入语句时未出现错误:

INSERT INTO tb_macaddresses(fmacaddr)
VALUES('18:FD:74:7F:73:D3'::macaddr);

请问如何解决程序中出现的该异常问题?

解决方案
  • 校验输入值非空
    异常提示string contains NULL,说明myedit.Text可能是空字符串或包含不可见NULL字符。赋值前先做校验:

    if Trim(myedit.Text) = '' then
      raise Exception.Create('MAC地址不能为空');
    mymacaddr.Value := Trim(myedit.Text);
    
  • 修正参数类型与SQL语句
    不要用ftString配合SQL里的强制转换,直接让组件处理类型映射:

    1. 修改SQL语句,去掉::macaddr强制转换:
      cInsertL2IfParams : string = 'INSERT INTO tb_macaddresses(fmacaddr) VALUES(:pMyMACAddress)';
      
    2. 调整参数类型为固定长度字符(匹配MAC地址的17字符长度):
      mymacaddr := MainDM.MainSQLQ.Params.CreateParam(TFieldType.ftFixedChar, 'pMyMACAddress', TParamType.ptInput);
      mymacaddr.Size := 17;
      mymacaddr.Value := myedit.Text;
      
  • 清理并格式化输入
    确保输入的MAC地址格式合规,去除多余字符并统一为冒号分隔格式:

    function CleanMAC(const AMAC: string): string;
    var
      I: Integer;
      C: Char;
    begin
      Result := '';
      // 提取有效十六进制字符
      for I := 1 to Length(AMAC) do
      begin
        C := UpCase(AMAC[I]);
        if (C in ['0'..'9', 'A'..'F']) then
          Result := Result + C;
      end;
      // 转换为标准冒号分隔格式
      if Length(Result) = 12 then
        Result := Copy(Result,1,2)+':'+Copy(Result,3,2)+':'+Copy(Result,5,2)+':'+
                  Copy(Result,7,2)+':'+Copy(Result,9,2)+':'+Copy(Result,11,2);
    end;
    
    // 使用清理后的MAC地址赋值
    mymacaddr.Value := CleanMAC(myedit.Text);
    
  • 检查数据库字段约束
    确认tb_macaddresses表的fmacaddr字段是否设置了NOT NULL约束,若有则必须保证插入值非空,这和第一步的校验逻辑对应。

内容的提问来源于stack exchange,提问作者Сергей Ливитин

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 07:10:33