[英]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.