我是把ADODataSet\ClientDataSet\DataSetProvider封装在一个类中的.
constructor TDBase.Create(AOwner:TComponent);
begin
  inherited;
  FIADOConnection:=ADOConnection;
  FADODataSet:=TADODataSet.Create(nil);
  FDSP:=TDataSetProvider.Create(nil);
  FCDS:=TClientDataSet.Create(nil);
  {$IFNDEF MultiTier}
  FADODataSet.Connection:=FIADOConnection.GetADOConnection;
  {$ENDIF}
  FADODataSet.ExecuteOptions:=[eoAsyncFetch];
  FADODataSet.OnFetchProgress:=FetchProgress;
  FADODataSet.OnFetchComplete:=FetchComplete;
  FCDS.SetProvider(FDSP);
  FDSP.DataSet:=FADODataSet;
end;function TDBase.GetRecordsCount(strSQL: string; var ASQLType: TSQLType): Integer;
const
  CountSQL='SELECT COUNT (*) AS Qty From (%s) AS V';
var
  FSql:string;
  if UpperCase(LeftStr(Trim(strSQL), 6))='SELECT' then begin
      FSql:=Format(CountSQL,[strSQL]);
      ASQLType:=stSelect
  else begin
      Result:=0;
      Exit;
  end;
   try
      try
        if FADODataSet.Acitve then
           FADODataSet.Close;
        FADODataSet.CommandType:=cmdText;
        FADODataSet.CommandText:=FSQL;
        FADODataSet.Prepared;
        FADODataSet.Open;//就会在这里出错
        Application.ProcessMessages;
        if (FADODataSet.Active) and (FADODataSet.RecordCount>0) then begin
          if FADODataSet.Fields[0].AsInteger>0 then
            Result:=FieldByName('Qty').AsInteger;
        end;
        FADODataSet.Close;
      except
        on E:Exception do ShowMessage(E.Message);
      end;
    finally
      //FDSP.DataSet:=FADODataSet;
    end;