我现在需要把TClientDataSet变量转换为TADOQuery,听说不能直接转换,所以做了一个函数,如下:
function getdatafromcds(scktconn: TSocketConnection;
tablename, sqlstr: String; var adoquery: TADOQuery): Boolean;
var
cds:TClientDataSet;
i,j:integer;
begin
cds:=TClientDataSet.Create(Application);
with cds do
begin
RemoteServer:=scktconn;
ProviderName:='DataSetProvider1';
CommandText:=sqlstr;
try
Open;
except
Result:=False;
Free;
Exit;
end;
end; adoquery:=TADOQuery.Create(Application);
adoquery
getstruct('jp_jbsjby_part3',adoquery);
adoquery.Fields.Clear;
adoquery.DisableControls;
for i:=0 to cds.Fields.Count-1 do
begin
adoquery.Fields.Add(cds.Fields[i]);
end;
adoquery.EnableControls;
adoquery.Edit; for i:=0 to cds.recordcount-1 do
begin
adoquery.Append;
for j:=0 to adoquery.Fields.Count-1 do
begin
adoquery.Fields[j].Value:= cds.Fields[j].Value;
end;
adoquery.Post;
cds.Next;
end;
adoquery.First;
cds.Free; Result:=True;
end;
其中getstruct('jp_jbsjby_part3',adoquery);是我以前定义的一个过程,可以为adoquery获得一个结构,并使adoquery处于open状态,当然这个结构不是我想要的。
现在的问题是运行到adoquery.Fields[j].Value:= cds.Fields[j].Value;时提示“dataset not in edit or insert mode”错误,哪位高人帮看一下,马上放分,谢谢了。
function getdatafromcds(scktconn: TSocketConnection;
tablename, sqlstr: String; var adoquery: TADOQuery): Boolean;
var
cds:TClientDataSet;
i,j:integer;
begin
cds:=TClientDataSet.Create(Application);
with cds do
begin
RemoteServer:=scktconn;
ProviderName:='DataSetProvider1';
CommandText:=sqlstr;
try
Open;
except
Result:=False;
Free;
Exit;
end;
end; adoquery:=TADOQuery.Create(Application);
adoquery
getstruct('jp_jbsjby_part3',adoquery);
adoquery.Fields.Clear;
adoquery.DisableControls;
for i:=0 to cds.Fields.Count-1 do
begin
adoquery.Fields.Add(cds.Fields[i]);
end;
adoquery.EnableControls;
adoquery.Edit; for i:=0 to cds.recordcount-1 do
begin
adoquery.Append;
for j:=0 to adoquery.Fields.Count-1 do
begin
adoquery.Fields[j].Value:= cds.Fields[j].Value;
end;
adoquery.Post;
cds.Next;
end;
adoquery.First;
cds.Free; Result:=True;
end;
其中getstruct('jp_jbsjby_part3',adoquery);是我以前定义的一个过程,可以为adoquery获得一个结构,并使adoquery处于open状态,当然这个结构不是我想要的。
现在的问题是运行到adoquery.Fields[j].Value:= cds.Fields[j].Value;时提示“dataset not in edit or insert mode”错误,哪位高人帮看一下,马上放分,谢谢了。
觉得这个功能不太可能实现因为要给adoquery添加数据,其必须处活动状态
那么设置Active:=true时,必然要执行SQL.Text...此时adoquery并没有连接字串,也没有连接到Tadoconnection的对象
for i:=0 to cds.Fields.Count-1 do
begin
adoquery.Fields.Add(cds.Fields[i]);
end;
這之前ADOQUERY的ACTIVE一定要先為TRUE.
第二
cds:=TClientDataSet.Create(Application);
with cds do
begin
RemoteServer:=scktconn;
ProviderName:='DataSetProvider1';
CommandText:=sqlstr;
try
Open;
except
Result:=False;
Free;
Exit;
end;
end;
這當中已經建立Field!
如果都有就應該沒問題了!
for i:=0 to cds.Fields.Count-1 do
begin
adoquery.Fields.Add(cds.Fields[i]);
end;
這之前ADOQUERY的ACTIVE一定要先為TRUE.///////////////////////////////如果adoquery.active:=true;肯定报错,因为没有连接字串!再者,如果有了连接字串的话,前边有了sqlstr干嘛不直接从数据库里取数据?