Caros colegas, estou criando uma classe de acesso a banco de dados, e ela irá funcionar da seguinte forma:
Dentro dela defino um SqlConnection, um ClientDataSet, um SqlDataSet, um DataSetProvider e um Datasource. para ter certeza que estaria fazendo tudo certo, adicionei um DataModulo em um projeto de teste e liguei os componentes entre si e o SqlConnection à base de dados. Depois fiz as mesmas ligações em código. O SqlConnection conectou normalmente, porém ao tentar dar o Open no ClientDataSet (com o Select já colocado no CommandText), ele da o seguinte erro: Project Teste.exe raised exception class EDatabaseError with message: 'Missing data provider or data packet'. Segue abaixo o código da Classe para tirarem suas dúvidas e como a utilizo: Obrigado. Unit clsBancodeDados; interface uses Classes,DBXpress, WideStrings, FMTBcd, Provider, DBClient, DB, SqlExpr; type TBancodeDados = class(TComponent) private { Private declarations } sPathBD : String; bConectado : Boolean; sc : TSQLConnection; sds : TSQLDataSet; dsp : TDataSetProvider; cds : TClientDataSet; ds : TDataSource; public { Public declarations } constructor Create(AOwner: TComponent); destructor Destroy; function Conectar : Boolean; function ComandoSql (qSql : String) : Boolean; property Conectado: Boolean read bConectado; procedure SetDirBanco(Value: string); property DirBanco : String read sPathBD write SetDirBanco; published protected end; implementation {$Region 'Construtor e Destrutor'} constructor TBancodeDados.Create(AOwner: TComponent); begin inherited Create(AOwner); //Instancia Objetos de Conexão ao Banco. sc := TSQLConnection.Create(Self); cds := TClientDataSet.Create(Self); sds := TSQLDataSet.Create(Self); dsp := TDataSetProvider.Create(Self); ds := TDataSource.Create(Self); //----< //Configura SQLConnection With sc.Params do Begin Clear; Add('DriverName= UIB FireBird15'); Add('Pasword=masterkey'); Add('User_Name=SYSDBA'); End; //----< //Configura SqlDataSet With sds do Begin DataSource := ds; MaxBlobSize := -1; SQLConnection := sc; End; //----< //Configura DataSource ds.DataSet := cds; //----< //Configura ClientDataSet cds.ProviderName := 'dsp'; //----< //Configura DataSetProvider dsp.DataSet := sds; dsp.Options := [poAllowCommandText, poUseQuoteChar]; //----< end; destructor TBancodeDados.Destroy; begin inherited Destroy; sc.Free; sc := nil; cds.Free; cds := nil; sds.Free; sds := nil; dsp.Free; dsp := nil; ds.Free; ds := nil; end; {$EndRegion} {$Region 'Métodos da Classe'} procedure TBancodeDados.SetDirBanco(Value: string); Begin sPathBD := Value; sc.Params.Add('Database='+sPathBD); End; function TBancodeDados.Conectar : Boolean; Var bRetorno : Boolean; Begin bRetorno := True; try sc.Connected; bConectado := True; Except bRetorno := False; end; Result := bRetorno; End; function TBancodeDados.ComandoSql (qSql : String) : Boolean; Var bRetorno : Boolean; Begin bRetorno := True; try With cds do Begin Close; CommandText := qSql; Open; End; Except bRetorno := False; end; Result := bRetorno; End; {$EndRegion} end. Utilizo ela assim: procedure TForm1.FormCreate(Sender: TObject); var BD: TBancodeDados; begin BD := TBancodeDados.Create(Self); With BD do Begin DirBanco := 'PROG4:C:\Documents and Settings\Humberto\Meus documentos\Banco\HUMB.fdb'; If Conectar Then ShowMessage('Conectou') Else ShowMessage('Não Conectou'); ComandoSql('SELECT * FROM CLIENTE'); End; end; [As partes desta mensagem que não continham texto foram removidas]