我如何获得一个TableName
的DataSet
?
我尝试这样做:
var
Tblname: string;
begin
Tblname := DBGrid1.DataSource.DataSet.TableName;
//it is not working
//DataSet.TableName is protected
end;
使用RTTI有可能得到的任何属性的值。下面的示例返回TableName
属性的值,提供有一个。我已经验证的代码在一个小项目。
主要的好处是,它适用于具有TDataset
属性的任何TableName
派生类。 (例如TTable
,也TSQLTable
或TFDTable
)
....
uses DB,rtti;
function GetTableNameFromDataset(aDataset:TDataset):string;
VAR lTableNameProp:TRttiProperty;
lContext:TRttiContext;
begin
Result:='';
if Assigned(aDataset) then
begin
lContext.Create;
try
lTableNameProp:=lContext.GetType(aDataset.ClassInfo).GetProperty('TableName');
if Assigned(lTableNameProp) then
Result:=lTableNameProp.GetValue(aDataset).AsString;
finally
lContext.Free;
end;
end;
end;
....
或使用旧式typinfo模块的替代解决方案(在RS 10.3测试过,但我希望它在D7以及工作)
...
uses DB,typinfo;
function GetTableNameFromDataset(aDataset:TDataset):string;
VAR lPropInfo:PpropInfo;
begin
Result:='';
if Assigned(aDataset) then
begin
lPropInfo:=GetPropInfo(aDataset.ClassInfo,'TableName');
if Assigned(lPropInfo) then
Result:=GetPropValue(aDataset,lPropInfo);
end;
end;
...