Iniciando com ADO no Visual Basic

Este capítulo contém uma série de tópicos que apresentam o novo padrão de acesso a dados do VB 6.0: ActiveX Data Objects ( ADO ). Por razões de compatibilidade são preservados os padrões DAO e RDO, mas para novos projetos é recomendado que já se faça uso do padrão ADO.

Soluções para Acesso a Dados Locais

O Problema

Você deseja uma simples e consistente interface de programação que possibilite as aplicações terem acesso e modificar uma larga variedade de fontes de dados. Uma fonte de dados pode ser tão simples quanto um arquivo de texto, complexa como um cluster de bancos de dados heterogêneos ou algo ainda por ser inventado. Além disto, uma interface de programação não deve presumir os meios de acesso e manipulação da fonte de dados.

Embora estas sejam as suas necessidades específicas, a fonte de dados típica é um banco de dados relacional que suporta o padrão ODBC e é manipulada com comandos escritos em SQL.

A solução genérica que a Microsoft oferece para este problema é a OLE DB, um conjunto de interfaces do tipo Component Object Model (COM) que provê acesso uniforme a dados armazenados em diferentes fontes de informação. Contudo, a interface de programação da OLE DB é feita para prover ótima funcionalidade numa larga variedade de aplicações, ela não atende ao requisito de simplicidade.

Você precisa de uma interface que seja uma ponte entre sua aplicação e a OLE DB. ActiveX Data Objects (ADO) é esta ponte.

A Solução

ADO define um modelo de programação – a seqüência necessária para acessar e modificar uma fonte de dados. O modelo de programação sumariza toda a funcionalidade da ADO.

O modelo de programação sugere um modelo de objetos – o conjunto de objetos que correspondem ao modelo de programação e o implementam. Objetos possuem métodos que realizam alguma operação sobre dados e propriedades que tanto representam algum atributo dos dados ou controlam o comportamento de algum método do objeto.

Associados aos objetos estão os eventos, que são notificações de que alguma operação ocorreu ou está para ocorrer.

Modelo Básico de Programação ADO

O ADO provê os meios para que você realize a seguinte seqüência de ações:

  1. Conecte uma fonte de dados. Opcionalmente você pode garantir-se de que todas as mudanças nos dados da fonte ocorram com sucesso ou não ocorram de modo algum.
  2. Especificar um comando para ter acesso à fonte de dados, opcionalmente com parâmetros variáveis ou opcionalmente com otimizações para performance.
  3. Executar o comando.
  4. Se o comando faz com que os dados sejam retornados na forma de registros de uma tabela, armazenar os registros em um cache que você pode facilmente examinar, manipular ou alterar.
  5. Se apropriado, atualizar a fonte de dados com mudanças no cache de registros.
  6. Prover uma forma geral de detectar erros ( usualmente como resultado de se fazer uma conexão ou executar um comando).

Normalmente você irá percorrer todos estes passos no modelo de programação. Contudo, vale a pena observar que a ADO é flexível o bastante para que você possa realizar trabalho de valor executando apenas parte do modelo. Por exemplo, você poderia armazenar dados de um arquivo direto em um cache de registros, então usar os recursos da ADO apenas para examinar os dados.

 

O Modelo de Programação ADO em Detalhes

Os seguintes elementos são partes fundamentais do modelo ADO de programação:

 

Connection

O acesso da sua aplicação a uma fonte de dados se dá através de uma conexão, o ambiente necessário para a troca de dados. Sua aplicação pode ter acesso a uma fonte de dados diretamente (às vezes chamado de sistema a duas camadas), ou indiretamente ( às vezes chamado de sistema a três camadas) através de um intermediário como o Microsoft Information Server.

O modelo de objetos realiza o conceito de conexão através do objeto Connection.

Uma transação delimita o início e fim de uma série de operações de acesso aos dados que ocorrem ao longo de uma conexão. A ADO garante que as mudanças nos dados resultantes de operações em uma transação ocorram todas bem sucedidas ou não ocorra nenhuma.

Se você cancela uma transação ou uma das operações da transação falha, o resultado final será como se nenhuma operação tivesse sido executada. A fonte de dados estará tal como estava antes do início da transação.

O modelo de objetos não engloba explicitamente o conceito de uma transação, mas representa-a com um conjunto de métodos do objeto Connection.

ADO acessa dados e serviços de provedores OLE DB. O objeto Connection é usado para especificar um provedor particular e qualquer parâmetro necessário.

Command

Um comando executado em uma conexão estabelecida manipula a fonte de dados de alguma forma. Normalmente se usa um comando para executar procedimentos armazenados em que se adiciona, exclui ou atualiza dados na fonte de dados ou retorna dados na forma de registros de uma tabela.

O modelo de objetos realiza o conceito de comando com o objeto Command A existência do objeto Command dá à ADO a possibilidade de otimizar a execução do comando.

Parameter

Freqüentemente comandos requerem partes variáveis, parâmetros, que podem ser alterados antes que você execute o comando. Por exemplo, você poderia executar o mesmo comando de obtenção de dados repetidas vezes, mas cada vez variando a sua especificação da informação a ser retornada.

Parâmetros são especialmente úteis para executar comandos que se comportam como funções. Neste caso você sabe o que o comando faz, mas não necessariamente como faz. Por exemplo, você emite um comando para fazer uma transferência bancária que debita uma conta e credita outra. Você especifica a quantidade de dinheiro a ser transferida como um parâmetro.

O modelo de objetos realiza o conceito de parâmetro com o objeto Parameter.

Recordset

Se o seu comando é uma consulta que retorna dados na forma de registros de informações em uma tabela (isto é, trata-se de uma consulta retornadora de registros) estes registros serão postos em uma memória local.

O modelo de objetos reconhece esta memória como um objeto Recordset . Contudo não há nenhum objeto que represente um único registro de um Recordset.

O Recordset é o meio básico de examinar e modificar dados em registros. O objeto Recordset lhe permite:

Field

Um registro em um Recordset consiste de um ou mais campos. Se você visualizar um Recordset como uma grade bi-dimensional, os campos são empilhados para formar colunas. Cada campo (coluna) tem entre os seus atributos um nome, tipo de dado e um valor. É este valor que contém o dado da fonte de dados.

O modelo de objetos realiza o conceito de campo com o objeto Field.

Para modificar dados em fontes de dados, você modifica o valor de objetos Field nos registros do Recordset. Finalmente as mudanças no Recordset são propagadas para a fonte de dados. Como uma opção, os métodos de gerenciamento de transações no objeto Connection podem garantir que as alterações se dêem como um todo ou falhem como um todo.

Error

Erros podem ocorrer a qualquer hora na sua aplicação, habitualmente como resultado de não ser possível estabelecer uma conexão, executar um comando ou realizar uma operação em um objeto em estado válido ( por exemplo, tentando usar um Recordset que ainda não foi inicializado).

O modelo de objetos representa o erro com o objeto Error.

Qualquer que seja o erro que acontece, ele produz um ou mais objetos Error. O próximo erro que ocorrer descartará os objetos Error atuais.

Property

Cada objeto ADO tem um conjunto de propriedades único que descreve ou controla o comportamento daquele objeto.

Há dois tipos de propriedades: intrínsecas e dinâmicas. Propriedades intrínsecas são parte do objeto e estão sempre disponíveis. Propriedades dinâmicas são adicionadas à coleção Properties dos objetos ADO pelo provedor de dados subjacente e existem apenas enquanto o provedor estiver sendo usado.

O modelo de objetos representa a propriedade pelo objeto Property..

Collection

ADO provê coleções, um tipo de objeto que convenientemente contém outros objetos de um tipo particular. Os objetos em uma coleção podem ser referenciados com um método da coleção tanto pelo nome, por uma string, pela ordem ou por um número inteiro.

ADO oferece quatro tipos de coleções:

Objetos ADO possuem propriedades as quais você atribui ou recupera valores com tipos de dados comuns como INTEGER, CHARACTER ou BOOLEAN. No entanto, é útil pensar de certas propriedades como retornando valores do tipo de dados "COLLECTION OBJECT". O objeto Collecttion, por sua vez , tem métodos para armazenar e retornar outros objetos adequados para a coleção.

Por exemplo, você pode pensar do objeto Recordset como tendo a propriedade Properties que retorna um objeto coleção. Esta coleção tem métodos para armazenar e retornar objetos Property descrevendo atributos daquele Recordset

Events

ADO 2.5 apresenta o conceito de eventos no modelo de programação. Eventos são notificações de que certas operações estão para ocorrer ou já ocorreram. Você pode usar eventos , em geral, para eficientemente orquestrar uma aplicação consistindo de diversas tarefas não sincronizadas.

O modelo de objetos não inclui eventos explicitamente, mas representa-os como chamadas a rotinas de tratamento de eventos.

Tratadores de eventos chamados antes que uma operação se inicie oferecem a você a oportunidade de examinar ou modificar os parâmetros da operação entrar com um cancelamento ou deixar que a operação se complete.

Tratadores de eventos chamados após uma operação se completar notifica-o do término de uma operação assíncrona. ADO 2.5 apresenta varias operações que foram melhoradas para opcionalmente serem executadas de modo assíncrono Por exemplo, uma aplicação que inicie a operação assíncrona Recordset.Open é notificada por um evento de execução completa quando a operação se conclui.

Há duas famílias de eventos:

 

Sumário do Modelo de Objetos ADO

Sumário de Objetos ADO

Objeto

Descrição

Connection

Suporta a troca de dados.

Command

Representa uma instrução SQL.

Parameter

Representa um parâmetro de uma instrução SQL.

Recordset

Suporta a navegação e manipulação de dados.

Field

Representa uma coluna de um Recordset.

Error

Representa um erro em uma conexão.

Property

Representa uma característica de um objeto ADO.

 

Sumário das Coleções ADO

Coleção

Descrição

Errors

Todos os objetos Error criados em resposta a uma única falha em uma conexão.

Parameters

Todos os objetos Parameter associados com um objeto Command.

Fields

Todos os objetos Field associados a uma objeto Recordset.

Properties

Todos os objetos Property associados com um objeto Connection, Command, Recordset ou Field.

Sumário dos Eventos ADO

ConnectionEvents

Descrição

BeginTransComplete,
CommitTransComplete,
RollbackTransComplete

Gerenciamento de Transação —Notificação de que a transação corrente na conexão foi iniciada, encerrada ou cancelada.

WillConnect, ConnectComplete, Disconnect

Gerenciamento de Conexão —Notificação de que a conexão corrente será iniciada ou foi iniciada ou encerrou.

WillExecute, ExecuteComplete

Gerenciamento de Execução de Comando —Notificação de que a execução do comando corrente na conexão será iniciado ou terminou.

InfoMessage

Informacional—Notificação de que há informação adicional sobre a operação corrente.

RecordsetEvents

Descrição

FetchProgress, FetchComplete

Retorna Status—Notificação do progresso de uma operação de recuperação de dados ou de que a operação de recuperação foi concluída

WillChangeField, FieldChangeComplete

Gerenciamento de Mudança de

Campo—Notificação de que o valor do campo corrente será mudado ou já mudou.

WillMove, MoveComplete, EndOfRecordset

Gerenciamento de Navegação—Notificação de que a posição atual do registro do recordset irá mudar, mudou ou encontrou o fim do arquivo.

WillChangeRecord, RecordChangeComplete

Gerenciamento de Mudança de Registro —Notificação de que algo no registro atual do Recordset mudou ou será mudado.

WillChangeRecordset, RecordsetChangeComplete

Gerenciamento de Mudança de Recordset—Notificação de que algo no Recordset atual será mudado ou já mudou.

 

Data Environment Designer 

O Viual Basic 6 lhe oferece a possibilidade de definir em tempo de projeto todo o conjunto de objetos ADO que você necessitará usar em sua aplicação. Para ajudar na configuração desses objetos lhe é fornecido o Data Environment Designer. Com uma interface gráfica fácil de usar, o Data Environment Designer lhe permite criar objetos Connection para acessar váriadas fontes de dados e, em cada conexão criada, definir objetos Command para acessar os dados das fontes conectadas. Para incluir o Data Environment Designer em sua aplicação, basta seleciona-lo no menu Project\More ActiveX Designers ...\Data Environment. O Data Environment será adicionado ao seu projeto e sua tela será imediatamente apresentada conforme a Figura 19.1.

Figura 19.1 A janela do Data Environment Designer

Um objeto do tipo Connection é automaticamente criado e adicionado à janela do DE. Você pode configurar essa conexão para usa-la e adicionar novas conexões à estrutura de árvore montada pelo DE para exibir seus objetos. Para configurar uma conexão, clique com o botão direito sobre ela e selecione Properties no menu popup. Será apresentada a janela de configuração das propriedades da conexão. Veja na Figura 19.2.

Figura 19.2 A janela de configuração do objeto Connection.

Nessa janela você definirá o provedor de acesso aos dados conforme o tipo de dado a ser acessado. Feita a escolha e clicando no botão Next, lhe será exibida a tab Connection (Figura 19.3). Neste ponto, você escolhe o banco de dados a ser acessado e introduz as informações de password e username (se necessárias). Clicando no botão Test Connection, você testa se a conexão está funcionando adequadamente.

Figura 19.3 Definindo a fonte de dados para a conexão.

Para que sua conexão tenha um nome mais expressivo do que Connection1, você só precisa clicar sobre o nome da conexão na janela do DE. O nome entra em modo de edição e você pode altera-lo como faria com o nome de um arquivo na janela do Windows Explorer. 

Mas de nada servirá sua conexão se você não criar os comandos que extrairão os dados que lhe interessam acessar em suas fontes de dados. Isto é feito com a criação de objetos Command e vinculando os a esta ou aquela conexão. Para adicionar um objeto Command, clique no botão apropriado na barra de ferramentas do DE ou clique com o botão direito do mouse sobre o objeto Connection ou sobre o Data Environment. No menu popup, selecione Add Command.

É então a vez de configurar as propriedades do objeto Command. Para faze-lo, dê um clique com o botão direito do mouse sobre o objeto Command a ser configurado. No menu popup que surgirá, selecione Properties. A janela de configuração do objeto Command surgirá como na Figura 19.4.

Figura 19.4 A janela de configuração do objeto Command

Nessa janela você criará uma vinculação do objeto Command com uma das conexões existentes no seu projeto e indicará o objeto de origem dos dados a serem pesquisados pelo Command na fonte de dados da conexão. Isto pode ser feito selecionando o objeto de uma combo box ou criando uma instrução de SQL. Feita essa configuração, será possível definir outras propriedades do objeto Command percorrendo as demais tabs da janela.

Note que os objetos Command e Connection cumprem no modelo de objetos ADO papéis equivalentes aos dos objetos Workspace e Querydef no modelo DAO. Objetos Command e Connection criados no Data Environment são de acesso global dentro do projeto, mas instâncias desses objetos também podem ser criadas com código dentro de sua aplicação para serem usadas em contextos de módulo ou procedimento. Para isso é preciso – caso o Data Environment Designer não esteja incluído no projeto – fazer uma referência à Microsoft ActiveX Data Objects Library 2.5 na janela References.

 

Código colado que se ajusta ao contexto é com a linguagem de macros do RabJump