簡體   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