我现在需要把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”错误,哪位高人帮看一下,马上放分,谢谢了。

解决方案 »

  1.   

    adoquery.Fields[j].Value:= cds.Fields[j].Value;  //先别用cds赋值,直接赋个常值试试行吗?
      

  2.   


    觉得这个功能不太可能实现因为要给adoquery添加数据,其必须处活动状态
    那么设置Active:=true时,必然要执行SQL.Text...此时adoquery并没有连接字串,也没有连接到Tadoconnection的对象
      

  3.   

    第一
      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!
    如果都有就應該沒問題了!
      

  4.   

    第一
      for i:=0 to cds.Fields.Count-1 do
      begin
        adoquery.Fields.Add(cds.Fields[i]);
      end;
    這之前ADOQUERY的ACTIVE一定要先為TRUE.///////////////////////////////如果adoquery.active:=true;肯定报错,因为没有连接字串!再者,如果有了连接字串的话,前边有了sqlstr干嘛不直接从数据库里取数据?