Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 获取TField所在的表的名称_Delphi_Tdataset - Fatal编程技术网

Delphi 获取TField所在的表的名称

Delphi 获取TField所在的表的名称,delphi,tdataset,Delphi,Tdataset,我使用的是一个TDataSet,其中CommandText属性设置为SQL查询。我还创建了以下函数,该函数基于TDataSet的字段创建SQL查询的一部分。然而,这是不完整的。如您所见,我仍然需要获取TField所在的表的名称。我如何做到这一点 function GetDataSetFieldsMSSQL(Dataset: TDataSet): String; var I, L: Integer; TableName: String; begin Result := ''; L

我使用的是一个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;
函数getDataSetFieldsMSQL(数据集:TDataSet):字符串; 变量 一、 L:整数; TableName:String; 开始 结果:=''; L:=Dataset.Fields.Count; 如果(L>0),则 开始 表名:=…//Dataset.Fields[0]字段的表的名称。 结果:='['+TableName+'].'+Dataset.Fields[0].FieldName+']; I:=1; 而(我据我所知,无法从SQL查询组件获取表名。
但是,您可以为字段指定别名,例如:“选择foo_字段作为foo_dot_foo_field from foo”,然后将其替换为正确的语法:“结果:='['+StringReplace(DataSet.fields[0].FieldName,'dot','.[',[rfReplaceAll])+']””

如果您不知道或无法控制查询中使用的SQL,那么您尝试执行的操作是不可能的。 查询可以包含计算字段或从视图返回字段等。此外,数据库可能有多个包含相同字段名的表

如果可能的话,您可以查询SQL server view INFORMATION_SCHEMA.COLUMNS,并通过这种方式尝试找出字段名来自哪个表。但是,如果字段名不是唯一的,这也可能被证明是不可能的


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

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

  • RSS提要
  • XML文件。示例:TCliendataset是一个TDataset子体,可以从其 自己的格式或使用XMLTransformProvider
  • 它可以是一个用于读取Excel电子表格的SQL,也可以是一个文本文件(如果您有用于读取的ODBC驱动程序) 并配置了数据源
  • Sky(以及全世界Delphi程序员的想象力)是一个字段在TDataset中所能表示的极限
  • 由于您使用的是ADODataset,因此有一些备选方案:

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

    您可以使用Delphi函数
    GetTableNameFromQuery(SQL:String):String来自
    DBCommon
    单元。只需在uses上添加
    DBCommon
    。=)

    有趣的问题。我唯一能想到的是
    TField.Origin
    ,但它不适合我(可能它只适用于BDE)。。。您使用的是什么TDataSet-desendant?…对于MSSQL中的
    TADODataSet
    ,您可以使用(对我适用)
    ADODataSet1.Recordset.Fields[i].Properties['BASETABLENAME'].Value
    ADODataSet1.Recordset.Fields[i].Properties['BASECOLUMNNAME'].Value
    谢谢您的评论。我同时使用TADODataSet和MSSQL,所以您的解决方案也适用于我。也许对于一个简单的TDataSet根本没有解决方案?毕竟TDataSet的目的是有效地隐藏底层数据结构。14年的Delphi编程,我从不关心如何获得字段链接的表……我只想使用TDataSet来计算表名和字段名。在这种情况下,修改SQL将破坏我函数的用途。