高手请进-------动态改变数据集问题(200分)

  • 主题发起人 主题发起人 5i1zhou
  • 开始时间 开始时间
5

5i1zhou

Unregistered / Unconfirmed
GUEST, unregistred user!
我程序要根据不同情况改变数据集。。而且我知道数据集的字串名称如"AdoQuery1",然而我怎么把字串转成真正已存在的数据集?
例如:
if tt=1 then
begin
//我以从数据库中得知,他的数据集名为“DataModule2.ADOQuery1“
DataSource1.DataSet:=?????????????(应为DataModule2.ADOQuery1)
end;
///////////////////////
原先想用FindComponent函数,可不在此窗体的数据集不能查找,如“DataModule2.ADOQuery1“
我想把字串转化TDataSet()型,可总会出错。。高手指点!!!!!!!!!!
end;

 
TDataSet(application.FindComponent('DataModule2.ADOQuery1'))
应该可以
 
DataModule2.FindComponent('ADOQuery1')
 
application.FindComponent('DataModule2.ADOQuery1'))
 
上面我说的应该不行!;

搂住的意思是否是这样?
先把字符串'DataModule2','adoquery1'分别取出来
然后
如coldew所说:
TdataModule(strDM).FindComponent(strado);


 
TdataModule(strDM),这样可以转换吗?呵呵。
如果可以的话,TDateSet('DataModule2.ADOQuery1')不就可以了嘛。。
可能不太行吧。。。呵呵。
 
给你一个通用函数,使用TClientDataSet来传递数据集就可以了!这个肯定比你原来的方式强多了!!!快给分吧!

function CDSExcuteQuery(SQLStr: String; CDS: TClientDataSet): String;
var
TmpProvider: TDataSetProvider;
begin
Result := '0';
with DmBasic.ADOQuery do begin
Close;
SQL.Text := SQLStr ;
try
if not DmBasic.ADOConnection.InTransaction then DmBasic.ADOConnection.BeginTrans;
if not Prepared then Prepared;
if (Uppercase((Copy(Trim(SQLStr), 1, 3))) = 'SEL') then //
Open
else
ExecSQL;
DmBasic.ADOConnection.CommitTrans;
except
//自定义……
end;
if (Uppercase((Copy(Trim(SQLStr), 1, 3))) = 'SEL') then begin
TmpProvider := TDataSetProvider.Create(nil);
TmpProvider.DataSet := DmBasic.ADOQuery;
CDS.Data := TmpProvider.Data;
TmpProvider.Free;
end;
end;
end;
 
呵呵!findcompent应该是正解!
不过安全起见应该先判断有没有找到
if assigned(FindComponent('ADOQuery1')) then
TDataSet(FindComponent('ADOQuery1'))
 
对于多个表并带有Datasource的操作我一般是让它创建和释放,这个的好处是不用考虑以前它是属于对哪一个表的操作,而且占的资源比较少。如果是在对主细表的进行的操作中这种优势就更为明显了。你这里我当然同样建议这样做。
 
谢谢大家的参于,问题已经解决了。。在我查看vcl类库之后。。代码没代。。呵呵。
过后发布。。
 
后退
顶部