[英]Delphi Firedac - FieldName issue
我将带有 MS Access 基础的应用程序(Delphi 10.3)从 ADODB 迁移到 Firedac。 当某些 TField FieldName 具有复杂名称时,我遇到了问题:简单示例: CREATE TABLE TEST ([SE_NAME] CHAR(3))
在像SELECT * FROM TEST T1 LEFT JOIN TEST T2 ON T1.SE_NAME=T2.SE_NAME
我期望 FieldNames :'T1.SE_NAME' 和 'T2.SE_NAME' (就像在 Access 2013 中一样)。
使用 ADODB TADOQuery :
var f: TField;
var s: string := '';
for f in Query.Fields do
s := s + f.FieldName + ' ;' ;
s是'T1.SE_NAME ;T2.SE_NAME ;' 行。
使用 Firedac TFDQuery :
var f: TField;
var s: string := '';
for f in Query.Fields do
s := s + f.FieldName + ' ;' ;
s是'SE_NAME ;SE_NAME_1 ;' : 不正常 : FireDac 更改列名称。
如何保留(使用 Firedac 选项?)真正的列名,而不更改 SQL 查询(为了兼容需要)?
在 MSAccess (2013) 中SELECT * FROM TEST T1 LEFT JOIN TEST T2 ON T1.SE_NAME=T2.SE_NAME
是:
注意 :
这被称为技术部门:您过去做出了您认为很好的决定,现在证明它造成的损害比您过去选择不同(以更低的成本)的方式造成的损失更大。
SELECT * FROM test JOIN test
立即提出问题:
你应该克服你的设计决定并修复它:
仅选择您实际需要的那些列。 无论表有多少列。 这也有助于在跟踪问题时避免歧义(同时有助于总体性能)。
使用别名来准确地得到你想要的结果:
t1.column
作为结果中的列名,则通过SELECT t1.column AS "t1.column"
(Ansi SQL,大多数 DBMS 支持这一点)定义它。SELECT t1.column AS [t1_column]
。 或者直接使用一个独特的别名。 如果你不定义它,你不能指望没有任何惊喜(FireDAC 肯定想帮助你处理带下划线的后缀,否则它只会覆盖现有的匹配项)。 只需在不同的 DBMS 中尝试SELECT 1+ 1* 2 FROM table
并查看生成的结果列名称 - 我想知道您如何准备在不使用列别名的情况下访问它。
您甚至可以多次从同一个表中选择同一列: SELECT column AS c1, column+ 2021 AS c2 FROM test
,但您希望在不使用别名的情况下神奇地解决问题吗? 只需使用它们 - 不要让它未定义。 有疑问做SELECT name AS name FROM test AS t
(即使这样也不能完全确定生成的列名是name
还是NAME
- 这就是为什么你应该在别名周围使用引号)。
如果您想将SELECT * FROM
与Query.Fields.Fieldname
混合使用以获取一个表可能具有的列名列表,那么每个表都可以这样做,而不是将多个表放入查询中。 甚至这种方法也不好 - 而是咨询 DBMS 信息模式 - 在 FireDAC 中有Get*Names()
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.