向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里的强制转换,直接让组件处理类型映射:- 修改SQL语句,去掉
::macaddr强制转换:cInsertL2IfParams : string = 'INSERT INTO tb_macaddresses(fmacaddr) VALUES(:pMyMACAddress)'; - 调整参数类型为固定长度字符(匹配MAC地址的17字符长度):
mymacaddr := MainDM.MainSQLQ.Params.CreateParam(TFieldType.ftFixedChar, 'pMyMACAddress', TParamType.ptInput); mymacaddr.Size := 17; mymacaddr.Value := myedit.Text;
- 修改SQL语句,去掉
清理并格式化输入
确保输入的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,提问作者Сергей Ливитин
相关产品推荐
相关产品推荐

