我试图通过将 NULL 条目(对于
TDBGrid
)更改为空字符串来修复 VARCHAR(255)
中的排序顺序,但我得到:
EDatabaseError,消息为“Table1:字段‘MyName’的类型不匹配”, 期待:字符串实际:WideString'。
TFDQuery
中的查询看起来像:
Select Table1.*, IFNULL(Table2.Name,'') AS MyName
From Table1
LEFT JOIN Table2
ON (Table1.LinkField=Table2.UniqueId)
我做错了什么?
更多信息:
如果我设置
Params["StringFormat"]=sfANSI
消息消失,但我在 TEXT
字段中的现有文本变成中文。
我现在明白了FireDAC SQLite映射的意思了。在这种情况下:
VARCHAR -> dtAnsiString, Len = L
TEXT -> dtWideMemo
如何告诉
IFNULL
使用字符串而不是宽字符串? Table2.Name
是一个VARCHAR
.
TIA!!
看起来问题出在您对
MyName
字段的查询返回的数据类型上。错误消息表明 TDBGrid 需要字符串数据类型,但查询返回的是 WideString。
您可以尝试将查询中的
MyName
字段的数据类型显式更改为 VARCHAR(255)
,如下所示:
SELECT Table1.*, IFNULL(CAST(Table2.Name AS VARCHAR(255)), '') AS MyName
FROM Table1
LEFT JOIN Table2
ON (Table1.LinkField = Table2.UniqueId)
这应该确保
MyName
字段始终作为VARCHAR(255)
数据类型返回,即使Name
中的Table2
字段是NULL
。
至于当您设置
TEXT
时,Params["StringFormat"]=sfANSI
字段中的现有文本变成中文的问题,很可能是文本的编码方式与ANSI
格式不兼容。您可以尝试使用不同的编码,例如 UTF-8
,看看是否可以解决问题。例如,您可以设置Params["StringFormat"]="UTF-8"
.
要将
Params["StringFormat"]
设置为"UTF-8"
,您可以简单地将值分配给属性,如下所示:
FDQuery1.Params.ParamByName('StringFormat').AsString := 'UTF-8';
这会将参数值设置为
"UTF-8"
。 确保在执行查询之前设置此参数。