我在
SQLite
中创建了一个 VARCHAR(50) 字段 InvoiceRef,它映射到 TEXT 字段。
如果我在 Delphi 中使用简单的查询,例如 从发票中选择 InvoiceID、InvoiceRef
这显示得很好,但如果我使用 INNER JOIN,例如
SELECT * FROM Invoices LEFT JOIN Customers ON
(Customers.CustomerID=Invoices.CustomerID)
InvoiceRef 将显示空白。 但是,在 SQLite 数据库浏览器上使用相同的 JOIN 查询时,将正确显示 InvoiceRef 文本。
使用
TFDQuery
打开表格,TEXT 字段映射到 TWideMemoField。
我已经设置了这个
DisplayValue
的DisplayWidth
和TField
。
if oField is TWideMemoField then
begin
TWideMemoField(oField).DisplayValue := dvFull;
TWideMemoField(oField).DisplayWidth := 255;
end;
但是,使用 FDQuery1.FieldByName('SOMENAME').AsString 仍然返回空白(对于 JOIN 查询,但适用于直接非联接 SQL 查询)。
如何让上面的代码工作? 如果它甚至没有使用 .AsString 给我值,那么值自然不会出现在 TListview 中。
还是使用数据库映射来映射字段类型更好? 不熟悉映射,但我有类似的东西:
with FFDQuery.FormatOptions do
begin
OwnMapRules := True;
with MapRules.Add do
begin
SourceDataType := dtMemo;
TargetDataType := dtAnsiString;
end;
with MapRules.Add do
begin
SourceDataType := dtWideMemo;
TargetDataType := dtWideString;
end;
end;
我应该尝试使用方法 1 还是方法 2 来解决问题?
您最好使用数据库映射来解决该问题。
有几个原因: 由于映射规则位于一个位置,因此更容易维护,并且如果需要,更容易跨不同查询进行任何类型转换。 您还可以为各种数据类型定义映射规则,这有助于防止数据类型不匹配,从而导致更多问题。
祝你好运。