Delphi 获取TField所在的表的名称
我使用的是一个TDataSet,其中CommandText属性设置为SQL查询。我还创建了以下函数,该函数基于TDataSet的字段创建SQL查询的一部分。然而,这是不完整的。如您所见,我仍然需要获取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
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;
而(我但是,您可以为字段指定别名,例如:“选择foo_字段作为foo_dot_foo_field from foo”,然后将其替换为正确的语法:“结果:='['+StringReplace(DataSet.fields[0].FieldName,'dot','.[',[rfReplaceAll])+']””如果您不知道或无法控制查询中使用的SQL,那么您尝试执行的操作是不可能的。 查询可以包含计算字段或从视图返回字段等。此外,数据库可能有多个包含相同字段名的表 如果可能的话,您可以查询SQL server view INFORMATION_SCHEMA.COLUMNS,并通过这种方式尝试找出字段名来自哪个表。但是,如果字段名不是唯一的,这也可能被证明是不可能的
也许对于一个简单的TDataSet根本没有解决方案 我相信没有。因为TDataset可以从RDBMS表中获取其“数据”。 它可以是:
- 解析ADOCommand的commandText
- 使用ADORecordSet的BASETABLENAME属性(如kobik的评论)
- 按惯例猜测()
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将破坏我函数的用途。