segunda-feira, 9 de abril de 2007

PromptDataSource - ADO API - Se sua aplicação pudesse acessar qualquer base de dados

PromptDataSource - ADO API

Se sua aplicação pudesse acessar qualquer base de dados, trabalhar tanto conectado ou não. Independente se o seu aplicativo cliente seja browser ou não.

Imagine if your applications could store some bytes of data on the client-side, does not even matter if your client being browser or not, both persistently and securely. No server needed.

Por conta de algum problema enfrentado no trabalho, me vi obrigado a desenvolver uma “ferramenta” que me auxiliasse acessar qualquer base de dados, de maneira que eu pudesse escolher dinamicamente qual, exibir o conteúdo de uma tabela qualquer e a partir desses dados gerar um arquivo para ser consumido por outro aplicativo.

No Delphi, existe um componente dataset feito especificamente para trabalhar no lado cliente (TClientDataSet implements a database-independent dataset). Esse componente é a menina dos olhos dos criadores do Delphi, dentre várias funcionalidades incríveis que ele possui destacaremos nesse artigo algumas muito interessantes e úteis. Esse componente chama-se ClienteDataSet, a Classe dele é TClientDataSet que esta definida na unit DbClient. Ele tem a funcionalidade de persistir os dados sem a necessidade de estar conectado ao servidor de dados, e ainda gravar no cliente esses dados, temporariamente, em formato binário ou XML.

Outro ponto importante que abordaremos é o uso da função “PromptDataSource” (esta definida na unit ADODB), ela é uma API da middleware de acesso a dados OLE DB que nos prove uma interface para configurarmos uma string de conexão para qualquer banco de dados suportado por ela. Isso é muito útil quando caso vc necessite acessar várias bases diferentes com o mesmo aplicativo.
Neste exemplo não estou preocupado em desacoplar o acesso a dados da apresentação. Esse assunto será tratado em outros artigos focados em estilos arquitetônicos.

Construindo o aplicativo de exemplo

Inicie uma nova aplicação no Delphi: Menu File ► New ► Application.
No Form1 adicione os seguintes componentes:


4 Buttons (TButton): Palheta Standard. Altere as seguintes propriedades: 
Name:
Button1 = btnLoadBase.
Button2 = btnTransforme
Button3 = btnLoadData.
Button4 = btnExecuteQry.

Caption:
btnTransforme = Tranforme Datapacket.
btnLoadBase = Load From Database.
btnLoadData = Carregar Datapacket.
btnExecuteQry = Execute Query.



ADOConnection (TADOConnection): Palheta ADO. Altere a propriedade “Name” para MyConnection

ADODataSet (TADODataSet): Palheta ADO.
Alere a propriedade Name = adoDados. Associe ao ADOConnection, propriedade

Connection = MyConnection.


DataSetProvider (TDataSetProvider): Palheta Data Access.

Name = dspDados

Associe ao ADODataset

DataSet = adoDados

Configuraremos o DataSetProvider para que o comando SQL seja definido no ClientDataset. Na propriedade Option: poAllowCommandText = true.

ClientDataSet (TClientDataSet): Palheta Data Access.

Name = cdsDados

Associe ao DataSetProvider pela propriedade ProviderName = dspDados.

DataSource (TDataSource ): Palheta Data Access.
Associe ele ao CleintDataset pela propriedade DataSet = cdsDados.

Label1 (TLabel): Palheta Standard.
defina a propriedade Caption = Selecione a Tabela;

ComboBox (TComboBox): Palheta Standard.

Name = CmbTableNames


PageControl
Name = PgCDados.
Align = alBottom.

Nele, adicione dois tabsheet: Com o botão direito do mouse sobre o PageControl,

selecione “New Page:

TabSheet1: TTabSheet
Caption = Tabela
TabSheet2: TTabSheet
Caption = Texto

DBGrid (TDBGrid): Palheta Data Controls. OBS: Coloque ele dentro da TBSheet1.

Name = GrdDados

Associe ele ao DataSouece pela propriedade DataSource = dsDados.

Align = alClient


DBRichEdit (TDBRichEdit): Palheta Data Controls. OBS: Coloque ele dentro da TBSheet2

DataSource = dsDados



SaveDialog (TSaveDialog): Palheta Dialog.

Name = SDialog


OpenDialog (TOpenDialog): Palheta Dialog

Name = ODialog


Evento Click dos Botões:
 
(* OnClick do btnLoadBase*)
procedure TForm1.btnLoadBaseClick(Sender: TObject);
begin
MyConnection.ConnectionString := PromptDataSource;
if MyConnection.ConnectionString <> '' then
MyConnection.Connected := True;
CmbTableNames.ItemIndex := 0;
end;



procedure TForm1.btnTransformeClick(Sender: TObject);
begin
if cdsDados.Active then
if not cdsDados.IsEmpty then
if SDialog.Execute then
cdsDados.SaveToFile(SDialog.FileName, dfXML);
end;



procedure TForm1.btnLoadDataClick(Sender: TObject);
begin
cdsDados.Close;
if ODialog.Execute then
cdsDados.LoadFromFile(ODialog.FileName);
end



procedure TForm1.btnExecuteQryClick(Sender: TObject);
const
AqryCommand = 'Select * from %s';
begin
if MyConnection.Connected and (CmbTableNames.Text <> '') then
begin
cdsDados.Close;
cdsDados.CommandText := Format(AqryCommand, [CmbTableNames.Text]);
cdsDados.Open;
end;
end;



procedure TForm1.PgCDadosChange(Sender: TObject);
begin
if not cdsDados.Active then Exit;
if (GrdDados.SelectedField is TMemoField) or (GrdDados.SelectedField is TStringField) then
DBRichEdit1.DataField := GrdDados.SelectedField.FieldName;
end;



(*Evento AfterConnect do ADOConnection, MyConnection*)
procedure TForm1.MyConnectionAfterConnect(Sender: TObject);
begin
MyConnection.GetTableNames(CmbTableNames.Items);
end;

Um comentário:

  1. gostaria de saber mais sobre esse assunto usando tabela master details...pode ser?

    ResponderExcluir