FireDAC SQLITE with LEFT JOIN reassign NULL entries to an empty string results with Type Mismatch?

问题描述 投票:0回答:1

我试图通过将 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!!

delphi c++builder firedac
1个回答
0
投票

看起来问题出在您对

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"
确保在执行查询之前设置此参数。

© www.soinside.com 2019 - 2024. All rights reserved.