sqlite 无法使用FireDAC TFDQuery保存或加载外来字符

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

我有一个SQLite数据库,它被配置为:

SQLiteFDConnection->Params->Values["StringFormat"]=_D("Unicode");
SQLiteFDConnection->Params->Values["OpenMode"]=_D("CreateUTF8");

它有两个通过TFDQuery访问的表:
A)Table1TFDQuery)具有持久化字段,并使用TDataSource来显示TDBGrid中的项目。
B)Table2TFDQuery)也有持久字段。
Table1可以正常工作,它可以正确显示外来字符,并且永久字段被设置为使用TWideStringField
Table2的字段也是TWideStringField,直接使用Table2ExecSQL()INSERT INTOUPDATE语句。对于回阅读,它使用TFDQuery::Open(),然后使用FieldByName()。但是,外国字符只是问号。
我的问题是,既然我将StringFormat设置为Unicode,为什么Table2不能正确使用Unicode?
更新用途:

SQLiteDataModule->Table2->ExecSQL("UPDATE Table2 SET Name=:N where UniqueId=:U",
                 OPENARRAY(Variant, (UnicodeStringVarName, UniqueId)));

阅读回使用SQLiteDataModule->Table2->Open()中的Select * from Table2

String Name=SQLiteDataModule->Table2->FieldByName("Name")->AsString;

一个问题是我不能输出调试信息到事件窗口并显示正确的字符。我想在Update查询之前检查它,但它总是显示?? ??(有4个字符)。Name用于TTreeNode,如果使用普通字符串,我可以看到外来字符,因此在存储和加载回?? ??结果之间的某个地方。
字符串为UnicodeString
有什么想法吗

cwdobuhd

cwdobuhd1#

答案是您需要手动提供字段类型:

SQLiteDataModule->Table2->ExecSQL("UPDATE Table2 SET Name=:N where UniqueId=:U",
                 OPENARRAY(Variant, (UnicodeStringVarName, UniqueId)),
                 OPENARRAY(TFieldType, (ftWideString)); // <<<< Field Types

相关问题