尝试从使用Unicode/CreateUTF 16创建的SQLITE DB中打开TFDQuery失败,并出现错误“expecting:实际字符串:WideString ',为什么?

wj8zmpe1  于 2023-05-18  发布在  SQLite
关注(0)|答案(1)|浏览(196)

我决定将我的C++Builder项目从StringFormat=ChooseOpenMode=CreateUTF8的SQLITE默认版本迁移到Unicode版本:

SQLiteFDConnection->Params->Values["StringFormat"]=_T("Unicode");
SQLiteFDConnection->Params->Values["OpenMode"]=_T("CreateUTF16");
// NOTE: The same thing happens if I create it with:
//SQLiteFDConnection->Params->Values["OpenMode"]=_T("CreateUTF8");

我这样做是因为VARCHAR字段不接受日语字符(结果是??)。
然而,我甚至无法使用这两个设置打开新数据库而不出现此错误:
项目引发了异常类EDatabaseError,消息为“Table1:字段“Name”的类型不匹配,应为:实际字符串:WideString'.
NameVARCHAR项目之一(第一个)。
在另一篇文章中,提到要设置TFDQueryCharset,但在C++Builder中似乎没有FDQuery1.Params.Strings['Charset'] := UTF8Charset选项可用。
手册上说,对于SQLITE,当使用Unicode字符串格式时,VARCHAR将是UnicodeString
我一定是错过了什么,是什么?

附加:

我恢复了StringFormat=ChooseOpenMode=CreateUTF8的默认值,但将VARCHAR更改为NVARCHAR,并且对于任何使用NVARCHAR的字段,都将出现完全相同的异常。
它似乎并没有像Using SQLite with FireDAC所说的那样正确地进行转换。
需要说明的是,是AfterConnect事件中的FDQuery->Open()生成了异常。

kmynzznz

kmynzznz1#

答案是持久字段需要将类类型从TStringField更改为TWideStringField,然后一切都按预期工作。为了改变它们,我编辑了.dfm文件,并更新了.h文件。

相关问题