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

使用Unicode/CreateUTF16创建SQLite库后,TFDQuery打开报类型不匹配错误原因?

C++Builder FireDAC连接SQLite Unicode配置异常解决

问题背景

原配置StringFormat=Choose、OpenMode=CreateUTF8下,VARCHAR字段无法存储日文(显示为??),修改为Unicode配置后:

SQLiteFDConnection->Params->Values["StringFormat"]=_T("Unicode");
SQLiteFDConnection->Params->Values["OpenMode"]=_T("CreateUTF16");
// 注:使用CreateUTF8创建也会出现相同问题

打开新数据库触发异常:

Project raised exception class EDatabaseError with message 'Table1: Type mismatch for field 'Name', expecting: String actual: WideString'.

将VARCHAR替换为NVARCHAR、改回默认配置后仍触发相同异常,错误发生在AfterConnect事件的FDQuery->Open()操作。

解决方案

1. 修正静态字段类型(核心原因)

异常本质是设计时添加的静态字段类型与FireDAC返回的类型不匹配:

  • 当StringFormat=Unicode时,SQLite的VARCHAR字段会被FireDAC映射为WideString/UnicodeString类型
  • 若你在设计时为Name字段添加的是TStringField(对应AnsiString),就会触发类型不匹配错误

解决方法:

  • 打开FDQuery的字段编辑器
  • 将Name字段从TStringField修改为TWideStringField

2. 完善Unicode配置参数

在FDConnection的参数中补充字符集配置,确保编码一致性:

SQLiteFDConnection->Params->Values["StringFormat"] = _T("Unicode");
SQLiteFDConnection->Params->Values["OpenMode"] = _T("CreateUTF16"); // 或CreateUTF8,按需选择
SQLiteFDConnection->Params->Values["Charset"] = _T("UTF-8");

3. 关于NVARCHAR的说明

SQLite本身不存在NVARCHAR类型,它会自动将NVARCHAR映射为TEXT类型,因此修改字段类型为NVARCHAR无法解决问题,无需尝试。

4. 动态字段的适配(若使用动态生成字段)

若你未手动添加静态字段,而是依赖FireDAC动态生成字段:

  • 确保FDConnection的Params中没有覆盖类型映射的配置
  • 可以添加MetaDefSchema=SQLite参数,强制FireDAC使用SQLite的默认元数据映射规则:
    SQLiteFDConnection->Params->Values["MetaDefSchema"] = _T("SQLite");
    

内容的提问来源于stack exchange,提问作者user3161924

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:25:18