我将我的应用程序(Delphi10.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 + ' ;' ;的是'T1.SE_NAME ;T2.SE_NAME; OK。
使用Firedac TFDQuery:
var f: TField;
var s: string := '';
for f in Query.Fields do
s := s + f.FieldName + ' ;' ;的是'SE_NAME ;SE_NAME_1;:Not OK : FireDac更改列名。
如何(使用Firedac选项?)保持真实的列名,而不更改查询(为了兼容起见) ?
在MSAccess (2013年)中,SELECT * FROM TEST T1 LEFT JOIN TEST T2 ON T1.SE_NAME=T2.SE_NAME的结果是:

请注意:
发布于 2021-07-26 16:35:24
这就是所谓的技术部:你在过去做过一些你认为很好的决定,现在证明这比你过去选择不同(而且成本更低)造成的损害更大。
SELECT * FROM test JOIN test立即提出问题:
您应该克服您的设计决策并修复它:
- If you want `t1.column` as a column name in the results then define that thru `SELECT t1.column AS "t1.column"` (Ansi SQL, most DBMSs support this).
- _MS Access_ needs square brackets and [does not allow dots in aliases](https://stackoverflow.com/a/3601221/4299358) (the error message says "punctuation" but i.e. comma and colon are fine), so you have to come up with your own logic, i.e. underscores: `SELECT t1.column AS [t1_column]`. Or just use a distinctive alias right away.如果您没有定义它,您就不能期望没有意外(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信息模式-- 处理方法。https://stackoverflow.com/questions/68497262
复制相似问题