繁体   English   中英

Delphi Firedac - FieldName 问题

[英]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 支持这一点)定义它。
    • MS Access需要方括号,并且不允许在别名中使用点(错误消息说“标点符号”,但逗号和冒号都可以),因此您必须提出自己的逻辑,即下划线: 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 * FROMQuery.Fields.Fieldname混合使用以获取一个表可能具有的列名列表,那么每个表都可以这样做,而不是将多个表放入查询中。 甚至这种方法也不好 - 而是咨询 DBMS 信息模式 - 在 FireDAC 中有Get*Names()方法

交叉链接FireDAC 添加下划线SQL 选择连接:是否可以将所有列作为“prefix.*”前缀?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM