在无状态模式下,设置DatasetProvider的allowcommandtext=true
然后在客户端动态改变ClientDataSet的commandText,使用不同的sql语句取得数据。问题是:为什么第一次赋给一条语句,可以执行得到结果,第二次就不行了?
错误提示是:Can not perform this operation on an open dataset!如果我在第二次的时候,也是先close,然后,把和第一次同样的语句赋给clientdataset的commandtext去open,没有任何错误。thanks a lot 先!

解决方案 »

  1.   

    此错误提示是在中间层出现的异常,所以怀疑是DataSetProvider的问题。
      

  2.   

    给commandText赋值前一定要先执行close
      

  3.   

    给commandText赋值前一定要先执行close 或是确定已经关闭
      

  4.   

    ClientDataSet的commandtext变动前先关闭,是必须做的.
      

  5.   

    呵呵,再次active:=true之前,按习惯肯定会close的,所以问题不在此。我的代码如下:
    procedure TpurchaseCo.dspDs1BeforeGetRecords(Sender: TObject;
      var OwnerData: OleVariant);
    begin  with Sender as TDataSetProvider do
      begin
        if not DataSet.Active then
        DataSet.Active:=True;
        if not (VarIsEmpty(OwnerData) or VarIsNull(OwnerData))  then
          DataSet.Locate(DataSet.Fields[0].FieldName,OwnerData,[])
        else DataSet.First ;
      end;end;procedure TForm1.cdsMasBeforeGetRecords(Sender: TObject;
      var OwnerData: OleVariant);
    var
      LastValue: OleVariant;
      CDSClone:TClientDataSet;
    begin
      if cdsMas.Active then
      begin
        CDSClone := TClientDataSet.Create(nil);
        try
          CDSClone.CloneCursor(cdsMas, True);
          CDSClone.FetchOnDemand := False;
          CDSClone.Last;
          LastValue := CDSClone.Fields[0].AsString;
          CDSClone.Close;
        finally
          CDSClone.Free;
        end;
      end else
        LastValue:=null;  OwnerData := LastValue;end;
      

  6.   

    你这是前台报的错,还是后台报的错啊。
    无论是前台还是后台改变CommandText时,都必须先关闭它所在的记录集.
      

  7.   

    要关闭中间层中和 DataSetProvider 相连的 DataSet。
      

  8.   

    if ClientDataSet1.Active then ClientDataSet1.Active:=False;
      ClientDataSet1.CommandText:='select * from xxxx';
      ClientDataSet1.Active:=True;屡试屡爽,某问题的啦。
      

  9.   

    Kao又是把sql写到cds.CommandText。