我决定将我的C++Builder项目从StringFormat=Choose
和OpenMode=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'.Name
是VARCHAR
项目之一(第一个)。
在另一篇文章中,提到要设置TFDQuery
的Charset
,但在C++Builder中似乎没有FDQuery1.Params.Strings['Charset'] := UTF8Charset
选项可用。
手册上说,对于SQLITE,当使用Unicode
字符串格式时,VARCHAR
将是UnicodeString
。
我一定是错过了什么,是什么?
附加:
我恢复了StringFormat=Choose
和OpenMode=CreateUTF8
的默认值,但将VARCHAR
更改为NVARCHAR
,并且对于任何使用NVARCHAR
的字段,都将出现完全相同的异常。
它似乎并没有像Using SQLite with FireDAC所说的那样正确地进行转换。
需要说明的是,是AfterConnect
事件中的FDQuery->Open()
生成了异常。
1条答案
按热度按时间kmynzznz1#
答案是持久字段需要将类类型从
TStringField
更改为TWideStringField
,然后一切都按预期工作。为了改变它们,我编辑了.dfm
文件,并更新了.h文件。