3

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

4 回答 4

3

您可以使用本机的 DelphiGetTableNameFromQuery(SQL : String):String;功能DBCommon。只需DBCommon在用途上添加。=)

于 2014-04-07T19:41:41.270 回答
2

也许对于一个简单的 TDataSet 根本没有解决方案?

我相信不会。因为 TDataset 不仅可以从 RDBMS 的表中获取其数据。有可能:

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

您有一些选择,因为您使用的是 ADODataset:

  • 解析 ADOCommand 的 commandText
  • 使用 ADORecordSet 的BASETABLENAME属性(如 kobik 的评论)
  • 按惯例猜测(Abelisto 的回答
于 2012-06-19T21:12:27.820 回答
1

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

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

于 2012-06-19T20:37:40.973 回答
1

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

于 2012-06-19T12:01:29.453 回答