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]

Responder a