获取TField所来自的表的名称

时间:2012-06-19 11:14:42

标签: delphi tdataset

我正在使用一个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;

4 个答案:

答案 0 :(得分:2)

  

对于一个简单的TDataSet,可能根本没有解决方案吗?

我不相信。因为TDataset不仅可以从RDBMS表中获取“数据”。 它可以是:

  1. RSS提要
  2. XML文件。示例:TCliendataset是一个TDataset后代,可以从其'读取XML 自己的格式或使用XMLTransformProvider。
  3. 如果您有ODBC驱动程序,它可以是用于读取Excel电子表格或文本文件的SQL 那并配置了数据源。
  4. Sky(以及Delphi世界各地的程序员的想象力)是一个字段在TDataset中可以代表的限制。
  5. 您有一些选择,因为您使用的是ADODataset:

    • 解析ADOCommand的commandText
    • 使用ADORecordSet的 BASETABLENAME 属性(如kobik的评论)
    • 按惯例猜测(Abelisto's answer

答案 1 :(得分:2)

您可以使用GetTableNameFromQuery(SQL : String):String;单元中的Delphi函数DBCommon。只需在使用上添加DBCommon即可。 =)

答案 2 :(得分:1)

据我所知,没有任何方法可以从SQL查询组件中获取表的名称。 但是,您可以为字段指定别名,例如:“从foo中选择foo_field作为foo_dot_foo_field”,然后将它们替换为正确的语法:“Result:='['+ StringReplace(DataSet.Fields [0]。.FieldName,' dot ',']。[',[rfReplaceAll])+']'“

答案 3 :(得分:1)

如果您不了解或控制查询中使用的SQL,那么您要做的就是不可能的。 查询可以包含计算/计算字段,也可以从视图等返回字段。此外,数据库可能有多个包含相同字段名称的表。

如果可能,您可以查询SQL Server视图INFORMATION_SCHEMA.COLUMNS,并尝试找出字段名来自哪个表。但是,如果字段名称不唯一,那么这也可能是不可能的。