Delphi 10.3+FireDAC查询报错:无法将Null变体转为OleStr(仅新开发PC)
问题场景
使用Delphi 10.3搭配FireDAC开发64位MySQL应用时,执行如下极简查询(即使表为空或无Null记录),仍触发错误:Could not convert variant of type (Null) into type (OleStr)
FDQuery1.Close; FDQuery1.Sql.Clear; FDQuery1.Sql.Add('SELECT NAME FROM CUSTOMER' ); FDQuery1.Open;
该查询在MySQL Workbench中正常执行,仅在新安装Delphi的开发机器上出现问题,目前通过为每个查询添加WHERE NAME IS NOT NULL临时规避,但希望通过FireDAC设置从根源解决。
可行的FireDAC设置调整方案
不需要修改所有查询语句,通过调整以下FireDAC属性即可解决问题:
调整FDQuery的
FetchOptions.NullMode
将FDQuery的NullMode设置为nmEmptyString,FireDAC会自动将数据库返回的Null值转换为空字符串,避免变体类型转换失败。
代码设置方式:FDQuery1.FetchOptions.NullMode := nmEmptyString;也可在设计期通过Object Inspector找到FDQuery的
FetchOptions节点,直接修改NullMode属性。设置FDConnection的
HandleShared为True
64位环境下,FireDAC对MySQL连接句柄的管理可能存在差异,将FDConnection的HandleShared属性设为True,可修复因句柄非共享导致的Null值解析异常。启用FDConnection的
Advanced.UseUnicode
在64位环境中,Unicode字符串处理的兼容性问题可能引发该错误,将FDConnection的Advanced.UseUnicode设为True,确保字符串类型字段以Unicode方式处理,减少类型转换冲突。检查FireDAC MySQL驱动兼容性
新安装的Delphi自带的FireDAC驱动版本可能与目标MySQL服务器版本不匹配(比如MySQL 8.0+需要对应版本的驱动)。在FDConnection的Driver配置中,确认使用的驱动版本与服务器兼容,避免因协议差异导致的Null值解析错误。确认FDQuery字段定义的类型匹配
检查FDQuery中NAME字段的DataType是否设置为ftWideString(对应OleStr类型),若字段类型不匹配,也会触发变体转换错误。
以上设置调整后,无需在查询语句中添加Null过滤条件,即可正常执行查询。
内容的提问来源于stack exchange,提问作者AndyD

