首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi Firedac - FieldName问题

Delphi Firedac - FieldName问题
EN

Stack Overflow用户
提问于 2021-07-23 09:46:05
回答 1查看 590关注 0票数 0

我将我的应用程序(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:

代码语言:javascript
复制
  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:

代码语言:javascript
复制
  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的结果是:

请注意:

  • 我知道如何使用查询别名..。但我需要保持查询的兼容性。
  • 这些查询只是示例(不是真正的查询)。
EN

回答 1

Stack Overflow用户

发布于 2021-07-26 16:35:24

这就是所谓的技术部:你在过去做过一些你认为很好的决定,现在证明这比你过去选择不同(而且成本更低)造成的损害更大。

SELECT * FROM test JOIN test立即提出问题:

  • 为什么同一张桌子会连在一起呢?这在本质上是有道理的。
  • 真的所有列都需要吗?这是非常有效的。

您应该克服您的设计决策并修复它:

  • 选择,只选择实际需要的列。不管表中有多少列。这也有助于在跟踪问题时避免含糊不清(同时也有助于总体性能)。
  • 使用别名准确地获得所需的结果:
代码语言:javascript
复制
- 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 * FROMQuery.Fields.Fieldname混合以获得列名列表,那么一个表就可以按每个表执行,而不是向查询中抛出多个表。甚至这种方法也不是很好--而是咨询DBMS信息模式-- 处理方法

交联FireDAC添加下划线'?

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68497262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档