客户端: SoapConnection1,ClientDataSet1
  SoapConnection1.URL:=URLList.Text+'/soap/IDataMod';
  SoapConnection1.Open;
  if (SoapConnection1.GetSOAPServer as IDataMod).doSQL('select * from tree') then
    ClientDataSet1.Open;server端:ADOConnection1,ADODataSet1,DataSetProvider1
  function TDataMod.doSQL(SQL:string):boolean;
begin
  try
    if ADOConnection1.Connected then
    begin
      ADODataSet1.Close;
      ADODataSet1.CommandText := sql;
      ADODataSet1.Open;
      result :=true;
    end else
    begin
      result :=false;
    end;
  except
    result :=false;
  end;
end;问:为什么调用doSQL()时出现“ADODataSet1.commandText未赋值”?

解决方案 »

  1.   

    服务端要用SOAPDataModule不能用普通DataModule
      

  2.   

    汗!刚发现问题出在客户端:  SoapConnection1.URL:=URLList.Text+'/soap/IDataMod';
      SoapConnection1.Open;
      if (SoapConnection1.GetSOAPServer as IDataMod).doSQL('select * from tree') then
        ClientDataSet1.Open;GetSOAPServer将创建一个新的服务端Instance,所以你的doSQL将赋值给那个新的Instance,而原来的Instance的CommandText仍然为空,所以ClientDataSet Open的时候会出错。
    建议改用DataRequest,而不是用doSQL,因为根据服务端实现的不同,服务端可能是无状态的,因为doSQL和Open是两个独立的请求,在两次请求之间,服务端实例可能被释放重建,或是被Pool(ISAPI)。
    这种思路本来就是错的。