我是把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;
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;
解决方案:DLL、EXE之间共享DBRTL
同意 xixuemao(一点技术含量都没有) 的