繁体   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