簡體   English   中英

獲取TField來自的表的名稱

[英]Get name of table that TField is from

我正在使用TDataSet,其中CommandText屬性設置為SQL查詢。 我還做了以下函數,該函數根據TDataSet的字段創建SQL查詢的一部分。 但是它是不完整的。 如您所見,我仍然需要獲取TField來自的表的名稱。 我該如何實現?

function GetDataSetFieldsMSSQL(Dataset: TDataSet): String;
var
  I, L: Integer;
  TableName: String;
begin
  Result := '';
  L := Dataset.Fields.Count;
  if (L > 0) then
  begin
    TableName := ... // Name of the table for the Dataset.Fields[0] field.
    Result := '[' + TableName + '].[' + Dataset.Fields[0].FieldName + ']';
    I := 1;
    while (I < L) do
    begin
      TableName := ... // Name of the table for the Dataset.Fields[I] field.
      Result := Result + ',[' + TableName + '].[' + Dataset.Fields[I].FieldName + ']';
      Inc(I);
    end;
  end;
end;

對於一個簡單的TDataSet也許根本沒有解決方案?

我相信不是。 因為TDataset不僅可以從RDBMS表中獲取其數據。 有可能:

  1. RSS提要
  2. 一個XML文件。 示例:TCliendataset是一個TDataset后代,可以從其自己的格式或使用XMLTransformProvider讀取XML。
  3. 它可以是用於讀取Excel電子表格的SQL,也可以是文本文件(如果您具有ODBC驅動程序並配置了數據源)。
  4. Sky(以及世界各地Delphi程序員的想象力)是字段可以在TDataset中表示的限制。

由於使用的是ADODataset,因此有一些替代方法:

  • 解析ADOCommand的commandText
  • 使用ADORecordSet的BASETABLENAME屬性(如kobik的注釋所示)
  • 按照慣例猜測( Abelisto的回答

您可以使用Delphi函數GetTableNameFromQuery(SQL : String):String; DBCommon單元。 只需添加DBCommon就可以了。 =)

據我所知,沒有任何方法可以從SQL查詢組件中獲取表的名稱。 但是,您可以為字段指定別名,例如:“從foo中選擇foo_field作為foo_dot_foo_field”,然后將其替換為正確的語法:“ Result:='['+ StringReplace(DataSet.Fields [0] .FieldName,' dot ' ,']。[',[rfReplaceAll])+']'“

如果您不了解或無法控制查詢中使用的SQL,則您嘗試做的事情是不可能的。 該查詢可以包含計算/計算的字段,也可以是從視圖等返回的字段。此外,數據庫可能有幾個包含相同字段名稱的表。

如果可能,您可以查詢SQL Server視圖INFORMATION_SCHEMA.COLUMNS,然后嘗試找出字段名來自哪個表。 但是,如果字段名稱不是唯一的,則這也可能被證明是不可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM