Curso de ADO.NET e BDP - Parte IV

Acesso a dados no Delphi 8 for .NET

 

Parte IV – BdpDataAdapter

Vimos na parte III do curso que um BdpCommand permite a execução de comandos SQL no banco de dados. Geralmente, ao manipularmos uma tabela no BD através de uma aplicação, precisamos efetuar quatro operações básicas: consulta (Select ), atualização ( Update ), exclusão (Delete ) e inserção ( Insert ).

Dessa forma, o BdpDataAdapter abstrai em uma única estrutura quatro BdpCommands internos: SelectCommand , DeleteCommand , UpdateCommand e InsertCommand , que permitem manipular os dados do BD. Além disso, seu método Fill preenche um DataSet com os dados da consulta (o BDP permite ainda o uso da propriedade Active como alternativa).

 

Nota: conheceremos o DataSet em detalhes em vários exemplos nos capítulos a seguir deste curso. Por enquanto, é importante saber apenas que o DataSet permite a manipulação dos dados em memória, desconectado do banco de dados, semelhante ao que o ClientDataSet é para o DataSnap.

 

O método Update do BdpDataAdater atualiza os dados do BD com base nas alterações feitas no DataSet . AutoUpdate , semelhante ao Update , atualiza os dados no BD, sem no entanto usar comandos de atualização explícitos (eles são gerados por um BdpCommandBuilder ). O AutoUpdate é um recurso exclusivo do BDP, e semelhante ao que faz o DataSetProvider no DataSet (gerando automaticamente as instruções de atualização).

Dessa forma, o BdpDataAdapter funciona como uma “ponte” entre os dados armazenados no banco de dados e a cache da aplicação, gerenciando a execução de consultas e atualizações. Ele possui funcionalidade semelhante ao SQLDataSet + DataSetProvider do dbExpress / DataSnap .

Faremos agora um exemplo prático que demonstra a utilização do componente. Inicie uma nova aplicação do tipo Windows Forms Application . Expanda a conexão Employee no Data Explorer e arraste a tabela Country para o designer. Isso cria um BdpConnection e um BdpDataAdapter.

Clique de direita sobre o BdpDataAdapter e escolha a opção Configure Data Adapter Observe os comandos SQL gerados para o componente:

 

 

Essas instruções ficam armazenadas nas propriedades SelectCommand, DeleteCommandUpdateCommand e InsertCommand do BdpDataAdapter . Elas já foram configuradas quando arrastamos a tabela Country para o Designer . O processo manual de geração consiste em escolher uma conexão na opção Connection , marcar quais os comandos devem ser gerados ( Select , Update, Insert e Delete ) e clicar no botão Generate SQL . A opção Optimize faz com que somente a chave-primária ta tabela seja utilizada em instruções de atualização.

Clicando em PreviewData você pode visualizar os dados (clique em Refresh ):

 

 

Na opção DataSet marque o seguinte e clique em Ok.

 

 

Isso adiciona um componente DataSet ao Designer . Observe que o BdpDataAdapter aponte para esse componente através da propriedade DataSet , e que podemos ativá-lo através da propriedade Active (um recurso exclusivo do BDP conhecido como live-data).

 

 

Vamos configurar os controles do formulário. Coloque um DataGrid , três Buttons (“btUpdate”, “btAutoUpdate” e “btAbrir”) , dois TextBoxes (“tbStart” e “tbMax”) , um CheckBox (“cbContinue”) e dois Labels . Ajuste-os no formulários conforme mostrado a seguir (utilize a propriedade Text para configurar os textos dos componentes):

 

 

No evento Click do botão Update digite o seguinte:

 

procedure TWinForm.btUpdate_Click(

     sender: System.Object; e: System.EventArgs);

begin

  BdpDataAdapter1.Update(DataSet1);

end ;

 

Esse comando atualiza os dados usando as instruções de atualização configuradas. No evento Click do botão AutoUpdate digite o seguinte:

 

procedure TWinForm.btAutoUpdate_Click(

  sender: System.Object; e: System.EventArgs);

begin

  BdpDataAdapter1.AutoUpdate;

end ;

 

Esse comando atualiza os dados usando um BdpCommnandBuilder , é uma alternativa ao uso do Update . Se estiver usando BDP, com certeza o AutoUpdate é mais prático, porém não tão flexível. Aqui apresentei o uso dos dois métodos para você ver como funcionam na prática.

No evento Click do botão Abrir digite o seguinte:

 

procedure TWinForm.btAbair_Click(sender: System.Object; e:      System.EventArgs);

begin

  BdpDataAdapter1.Active := False;

   if tbStart.Text <> '' then

    BdpDataAdapter1.StartRecord := Convert.ToInt32(tbStart.Text);

   if tbMax.Text <> '' then

    BdpDataAdapter1.MaxRecords := Convert.ToInt32(tbMax.Text);

  BdpDataAdapter1.Active := True;

  DataGrid1.DataSource := DataSet1.Tables[0];

  BdpDataAdapter1.TableMappings.Clear;

  BdpDataAdapter1.TableMappings.Add('Table','COUNTRY');

end ;

 

Isso abre a consulta e configure o DataGrid para exibir os dados do primeiro DataTable do DataSet . Observe que configuramos as propriedades StartRecord e MaxRecords do BdpDataAdapter para limitar o número de registros retornados pelo cursor. Você pode, por exemplo, fazer cache apenas dos registro 5 a 50. Esse recurso é exclusivo do BDP.

No evento CheckedChange do CheckBox digite:

 

procedure TWinForm.cbContinue_CheckedChanged(sender: System.Object; e:    System.EventArgs);

begin

  BdpDataAdapter1.ContinueUpdateOnError := cbContinue.Checked;

end;

 

 Isso configura a propriedade ContinueUpdateOnError do BdpDataAdapter . Essa propriedade, um recurso exclusivo do BDP, especifica se o componente deve continuar atualizando os registros em cache caso um erro aconteça no servidor de BD, por exemplo, uma violação de Foreign-Key . Esse recurso é semelhante ao que se consegue passando o valor “-1” para o ApplyUpdates do ClienDataSet em uma aplicação DataSnap .

No evento Load do formulário digite o seguinte:

 

procedure TWinForm.TWinForm_Load(sender: System.Object; e: System.EventArgs);

begin

  BdpConnection1.Open;

end;

 

Execute a aplicação e faça alguns testes. Clique no botão Abrir para retornar os dados da consulta e preencher o DataSet , bem como exibir os dados no DataGrid.

 

 

Atualize o campo Currency de alguns registros e clique no botão Update . A seguir, faça o mesmo teste com o AutoUpdate . Volte para a IDE e limpe o CommandText da propriedade UpdateCommand do BdpDataAdatpter. Execute a aplicação, altere alguns registros e repare que o Update deixa de funcionar, pois precisa que as instruções SQL estejam configuradas no BdpDataAdapter . Verifique que o AutoUpdate continua funcionando, pois ele usa um BdpCommandBuilder internamente para gerar as instruções de atualização em tempo de execução.

Um alternativa é colocar um BdpCommandBuilder no formulário e apontar sua propriedade Adapter para o BdpDataAdapter . Com isso, você poderá chamar normalmente o Update sem configurar as instruções de atualização em tempo de design. No caso do BDP isso não é muito útil devido à existência do AutoUpdate , mas é muito utilizado em outros Providers como SQL Server e OleDb, por exemplo.

Agora marque a opção ContinueUpdateOnError e atualize o campo Country de alguns países, o que violará uma Foreign-Key no servidor:

 

 

Atualize os dados e verifique o BdpDataAdapter , mesmo após a primeira violação, tentou aplicar as alterações nos demais registros. O DataGrid se encarrega de usar um ErrorProvider para exibir um ícone com a mensagem de erro gerada no BD:

 

 

Nas próximas partes do curso veremos como usar transações com BDP e fazer consultas parametrizadas. Até lá!

Leia todos artigos da série