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.
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;
gostaria de saber mais sobre esse assunto usando tabela master details...pode ser?
ResponderExcluir