ADO - ACTIVE DATA OBJECTS

Conteúdo

Um pouco de história.

No princípio era o texto e trabalhava-se com arquivos ASCII, depois surgiu a DAO (Data Access Object) , lançada em 1992 e usada apenas pelo MS Access 1.0; em 1993 a versão da DAO foi lançada para o MS Access 1.1 e Visual Basic 3.0.

Em 1994 a versão 2.0 veio junto com o Access 2.0 , para quem usava o VB 3.0 havia a 'Compatibility Layer'. A versão 2.5 da DAO veio junto com o VB 4.0 e foi a última para o ambiente de 16 bits. Em 1995 a versão 3.0 contemplava o MS Acces 7.0 e Excel 7.0 e o VB 4.0 para ambiente de 32 bits.

Nesta época foi lançado também o RDO versão 1.0 que permitia acesso via ODBC a base de dados usadas no ambiente cliente/Servidor de uma maneira mais simples e rápida pois implementa uma fina camada de código sobre o ODBC API.

Em 1996 chegamos a versão 3.5 do Jet para MS Access 97 e MS Excel 97 (Windows 98) e o VB 5.0 e a versão 2.0 do RDO. Após o lançamento da versão 5.0 do Visual Basic a ADO ficou pronta , por isso não veio junta com o VB 5.0.

O ADO seria então uma evolução ao RDO ? Ficaríamos tentados a supor , mas não, o ADO não é apenas mais um controle para conexão a banco de dados como a DAO ou o RDO , ele vai além disso, pois pode ser usado para acessar qualquer fonte de informações.

Poderiamos dizer que o ADO é uma solução genérica proposta pela Microsoft para acesso uniforme a dados armazenados em diferentes fontes de informação: Web, Client/Servidor, Textos, ISAM(Access,Dbase),etc. Ele é baseado na OLE DB o qual é um conjunto de interfaces do tipo COM ( Component Object Model). O ADO é a interface entre a OLE DB e a sua aplicação.

Com o uso de ADO, podemos criar aplicações para acessar e manipular dados em um servidor de banco de dados via um provedor OLE DB. Ele pode ser usado em qualquer ferramenta que o suporte tais como: Visual Basic, Access, ASP (Active Server Pages) , Excel, etc.

Naturalmente o ADO possui características chaves para se desenvolver aplicações cliente/servidor e para a Internet e ao contrário da DAO ou RDO não possui uma rígida estrutura hierárquica de objetos, pois seus objetos podem ser criados independentemente uns dos outros,e, ao mesmo tempo este modelo de objetos é parecido com o modelo DAO e RDO , só que bem mais simples, de forma que se você esta familiarizado com DAO ou RDO os traumas não serão muitos.

A vantagem do modelo ADO é , segundo a microsoft , a alta velocidade, a facilidade de uso e a baixa utilização de memória. Na minha humilde opinião isto pode ser verdade para aplicações Cliente/Servidor e Web , já para acesso a base de dados padrão ISAM ( Access, Dbase , FoxPro) tenho lá minhas dúvidas.

Para usar ADO via ODBC você vai precisar de um DSN (Data Sorce Name) registrado. O ADO , através da tecnologia OLE DB, trabalha com provedores OLE DB, e o OLE DB é uma implementação COM para acesso de dados universal. Vislumbra-se a substituição gradual de ODBC pela tecnologia OLE DB, e a ADO atua como um envoltório ActiveX para OLE DB. Mais uma coisa: aprenda SQL.

ADO - Um pouco de teoria.

O modelo de objetos ADO - O modelo de objetos ADO é simples e parecido com o modelo DAO/RDO ,ele é composto de seis objetos primários mostrados na figura 1.0. Note que os objetos Errors, Parameters e Fields são partes de uma coleção.

Fig. 1.0

Vamos examinar mais de perto cada um deste objetos para tentar compreender o modelo de programação ADO. Tenha paciência pois seremos suscintos na descrição de cada item. Se quiser obter informações detalhadas sobre ADO visite o site da microsot - http://www.microsoft.com/ado.

Objeto Connection

É usado para criar uma conexão com um servidor de dados e pode ser criado independente de qualquer outro objeto, ele é análogo ao objeto Database do DAO e ao objeto rdoConnection do RDO. Ele representa uma única e específica sessão com uma fonte de dados. Como a ADO acessa dados e serviços de provedores OLE DB o objeto Connection é usado para especificar um provedor particular e os parâmetros necessários.

O objeto Connection contém duas coleções:

  1. Errors - contém os erros gerados durante uma conexão.
  2. Properties - representa o conjunto de propriedades para uma conexão

O objeto Connection contém os seguintes métodos.

  1. BeginTrans - inicia uma transação, se a base de dados suportar o processsamento de transações.
  2. Close - Encerra uma conexão.
  3. CommitTrans - Encerra uma transação.
  4. Execute - executa um comando SQL.
  5. Open - abre uma conexão para uma fonte de dados.
  6. RollbackTrans - Cancela e desfaz uma transação.

O objeto Connection contém as propriedades dadas a seguir:

  1. Attributes - Lê os valores de XactAttributeEnum para uma conexão.
  2. CommandTimeout - Determina o tempo de espera por um comando antes de gerar um erro.
  3. ConnectionString - Contém a informação necessária para estabelecer uma conexão , tal como um nome DSN ou uma senha.
  4. ConnectionTimeout - Determina o tempo de espera quando da tentativa de uma conexão antes de gerar um erro.
  5. DefaultDatabase - Indica a base de dados padrão para uma conexão.
  6. IsolationLevel - Lê ou determina o nível de isolação de uma transação.
  7. Mode - indica as permissões disponíveis em uma conexão para modificar dados.
  8. Provider - Indica o provedor OLE DB para uma conexão.
  9. Version - Indica a versão do ADO.

Objeto Error

Um objeto Error é gerado sempre que um erro for encontrado em uma operação ADO. Ele contém os detalhes sobre os erros de acesso a uma fonte de dados relacionados a uma conexão com um provedor.Cada objeto Error representa um erro específico do provedor e não do ADO os quais são mostrados em tempo de execução.

O objeto Error contém as propriedades:

  1. Description - explica o erro detalhando-o.
  2. HelpContext - retorna uma variável de contexto ID como um inteiro longo associado a um tópico do arquivo de HELP.
  3. HelpFile - retorna o caminho do arquivo de HELP
  4. NativeError - indica o código de erro específico do provedor para um objeto error.
  5. Number - indica o número do erro.
  6. Source - informa o nome do objeto que gerou o erro.
  7. SQLstate - retorna uma string de cinco caracteres no padrão SQL ANSI.

A coleção Errors possue um método:

  1. Clear - remove todos os erros dos objetos Error na coleção.

A coleção Errors tem duas propriedades:

  1. Count - indica o número total dos objetos Error.
  2. Item - retorna um objeto Error.

Objeto Command

O objeto Command contém a definição de um comando SQL ou de uma stored procedure ou de consultas ação que são executadas em uma fonte de dados. Ele é igual ao objeto QueryDef da DAO ou ao objeto rdoPreparedStatement do RDO. Pode ser usado para consultar um banco de dados e retornar registros em um objeto Recordset ou executar determinada operação.

Podemos criar um objeto Command sem ter definido previamente um objeto Connection definindo sua propriedade ActiveConnection para uma string de conexão válida. Ainda sim um objeto Connection será criado mas não será associado a uma variável objeto.

O objeto Command possui 5 propriedades:

  1. ActiveConnection - indica o objeto Connection ao qual o objeto Command esta associado
  2. CommandText - Contém o texto de um comando SQL
  3. CommandTimeout - Determina o tempo de espera durante a tentativa de estabelecer uma conexão.
  4. CommandType - Contém o tipo de Comando.(Stored Procedure, comando SQl, etc..)
  5. Prepared - Indica se irá ou não salvar uma versão compilada do comando antes de sua execução.

O objeto Command possui dois métodos:

  1. CreateParameter - Cria um novo objeto Parametro
  2. Execute - Executa o comando , consulta SQL ou stored procedure informada na propriedade CommandText

O objeto Command possui duas coleções:

  1. Parameters - A coleção dos objetos parametros do objeto Command.
  2. Properties - O conjunto de propriedades para o objeto Command

Objeto Parameter

Um objeto Parameter representa um parâmetro ou argumento associado a um objeto Command baseado em uma consulta parametrizada ou uma stored procedure.

O objeto Parameter possui oito propriedades:

  1. Attributes - é a soma de um ou de mais de um dos valores de ParameterAttributesEnum
  2. Direction - Indica se o parâmetro representa um parâmetro de entrada de saída, ambos ou o retorno de uma stored Procedure.
  3. Name - O nome do parâmetro que pode ser usado como referência.
  4. NumericScale - Determina ou retorna o número de casa decimais usadas
  5. Precision - Determina ou retorna o número máximo de dígitos usados enm valores numéricos.
  6. Size - Tamanho máximo em bytes ou caracteres
  7. Type - O tipo de dados do objeto parameter
  8. Value - O valor associado ao objeto parameter

O objeto Parameter possui um método

  1. AppendChunck - Usado para passar dados do tipo long binary ou long Character .

A coleção Parameters possui três métodos:

  1. Append - Anexa um objeto Parameter à coleção.
  2. Delete - Remove o objeto Parameter da coleção.
  3. Refresh - Atualiza o objeto Parameter da coleção.

Objeto Property

Representa um característica dinâmica de um objeto ADO definida pelo provedor. Os objetos ADO possui dois tipos de propriedades :

  1. Internas - implementadas no ADO e imediatamente disponíveis para qualquer novo objeto. Elas não aparecem como objetos Property em uma coleção Properties.
  2. Dinâmicas - definidas pelo provedor. Aparecem na coleção Properties do objeto ADO.

O objeto Property possui 4 propriedades:

  1. Attributes - indica as características da propriedade específica do provedor.
  2. Name - o nome da propriedade
  3. Type - o tipo de dados da propriedade
  4. Value - as configurações da propriedade.

Objeto Recordset

Um objeto recordset representa um conjunto de registros de uma tabela gerados por uma consulta ou por um comando executado. Seu comportamento é idêntico ao recordset do DAO e ao rdoResultSet do RDO.

Podemos criar objetos Recordset sem ter definido previamente um objeto Connection passando uma string de conexão ao método Open . Ainda sim a ADO irá criar um objeto Connection , mas não irá associá-lo a uma variável objeto. Desta forma se você abrir múltiplos objetos Recordset sem usar uma variável objeto a ADO criará um novo objeto Connection para cada novo objeto Recordset .

Você pode usar o objeto recordset para manipular dados no provedor da mesma forma que o faz localmente , neste caso os recordsets são chamados de Cursores, e podem ser definidos como:

  1. Dynamic Cursor - Permite a movimentação através do Recordset , ver adições, alterações e excluções feitas pelo usuário.
  2. Keyset Cursor - Idêntico a Dynamic Cursor ; somente não permite acesso a registros adicionados ou excluídos por outro usuário.
  3. Static Cursor - Gera uma cópia de um conjunto de registros , não permitindo acesso a adições, alterações e exclusões feitas por outros usuários.É o único cursor suportado localmente.(ADOR)
  4. Forward-only Cursor - Idêntico ao Dynamic Cursor ; permitindo somente a movimentação para a frente.

O objeto recordset possui duas coleções:

  1. Fields - Contém todos os Objetos Fields do objeto Recordset
  2. Properties - Contém todas os objetos Property para uma instância específica do objeto Recordset.

O objeto recordset possue dezenove métodos:

  1. Addnew - Cria um novo registro
  2. CancelUpdate - Cancela atualizaçoes pendentes
  3. Clone - Cria uma cópia de um objeto recordset
  4. Close - Fecha um objeto recordset
  5. Delete - Exclui o registro atual de um objeto recordse aberto.
  6. GetRows - Retorna múltiplos registros de um recordset em um vetor.
  7. Move - Muda a posição do registro atual.
  8. MoveFirst - Muda a posição do registro para o primeiro registro do recordset e o torna o registro atual.
  9. MoveLast - Muda a posição do registro para o último registro do recordset e o torna o registro atual.
  10. MoveNext - Muda a posição do registro para o próximo registro.
  11. MovePrevious - Muda a posiçãodo registro para o registro anterior.
  12. MoveNextRecordset - Retorna o próximo objeto recordset.
  13. Open - Abre um Cursor.
  14. Requery - Atualiza os dados de um recordset executando novamente a consulta que o gerou.
  15. Resync - Atualiza os dados de um objeto recordset.
  16. Supports - Informa a funcionalidade que o objeto recordset suporta.
  17. Update - Salva as alterações feitas no registro atual.
  18. UpdateBatch - Escreve todas as atualizações pendentes em lote para o disco.

O objeto Recordset contém dezessete propriedades:

  1. AbsolutePage - Informa o número da 'página' de localização do registro atual.
  2. AbsolutePosition - Determina a posição do registro atual.
  3. ActiveConnection - Informa a qual conexão o objeto recordset pertence.
  4. BOF - Informa que o registro atual está antes do primeiro registro.(Início do Arquivo)
  5. Bookmark - Retorna o bookmark que identifica o registro atual ou atribui ao registro atual o bookmark de um outro registro do recordset.
  6. CacheSize - Informa o número de registros do recordset que estão na memória.
  7. CursorType - Informa o tipo de cursor usado em u recordset.
  8. EditMode - Mostra o status da edição que esta sendo realizada no registro atual.
  9. EOF - Informa que o registro atual está posicionado depois do último registro.(Fim de Arquivo)
  10. Filter - Informa um filtro para os dados em um recordset.
  11. LockType - Informa o tipo de bloqueio dos registros durante a edição.
  12. MaxRecords - Informa o número máximo de registros que serão retornados de uma consulta.
  13. PageCount - Informa o número de páginas de dados que um recordset contém.
  14. PageSize - Mostra quantos registros constituem uma página no recordset.
  15. RecordCount - Informa o número de registros em um recordset.
  16. Source - Informa a fonte de dados em um objeto recordset ou o nome do objeto ou aplicação que gerou um erro.
  17. Status - Informa o status do registro atual.

Objeto Field e coleção Fields

O objeto Field representa a coluna de dados com um tipo de dados comum. A coleção Fields contém todos os objetos Fields de um objeto Recordset.

Um objeto Recordset possue uma coleção Fields as quais são constituidos por objetos Field. Cada objeto Field corresponde a uma coluna no Recordset.

O objeto Field contém dois métodos:

  1. AppendChunck - Anexa dados para um objeto Field binário ou Texto.
  2. GetChunck - Retorna o contéudo de um objeto Field binário ou Texto.

O objeto Field possui dez propriedades:

  1. ActualSize - Informa o tamanho atual de um campo válido.
  2. Attributes - Informa uma ou mais características do objeto Field.
  3. DefinedSize - Informa o tamanho definido de um objeto Field.
  4. Name - Informa o nome do objeto Field
  5. NumericScale - Determina ou retorna o valor que indica o número de casas decimais para valores numéricos.
  6. OriginalValue - Informa o valor do campo que existe em um registro antes da alteração.
  7. Precision - Determina ou retorma o valor que indica o número máximo de dígitos usados para representar valores.
  8. Type - Informa o tipo de dados de um objeto Field.
  9. UnderlyingValue - Mostra o valor atual do objeto Field em um arquivo.
  10. Value - Informa o valor de um objeto Field.

Para se referir a um objeto Field em uma coleção pelo seu índice ou pela sua propriedade Name podemos usar uma das seguintes formas

recordset.Fields.Item(0)
recordset.Fields.Item("name")
recordset.Fields(0)
recordset.Fields("name")
recordset(0)
recordset("name")
recordset![name]

Ufa ! pensei que não ia terminar , mas de qualquer forma aí esta um resumo de descrição do objeto ADO 2.0. A seguir veremos um exemplo de utilização efetiva da ADO. Até lá...

Conteúdo

ADO - Exemplo Prático

A ADO usa o objeto Recordset como a principal interface com os dados. É através dele que manipulamos os dados oriundos de um tabela ou de um comando SQL. A ADODB é uma implementação da ADO otimizada para o uso com os provedores OLE DB da Microsoft , incluindo o provedor ODBC Microsoft.

Para acessar uma base de dados que suporte ODBC podemos usar os drivers ODBC instalados e funcionando ou um provedor OLEDB. Os drivers ODBC instalados vão depender da base que estaremos acessando: SQL Server, Oracle , Access, etc...

Desta forma podemos criar um objeto Recordset associado a um DSN ( Data Source Name) que deverá ser previamente configurado usando os drives ODBC.

Mostraremos a seguir a instalação e configuração do driver ODBC para uma base de dados Access em uma máquina local, localizada no diretório c:\teste.Usaremos a base de dados Biblio.mdb

Vamos mostrar criar um Data Source Name - ( DSN) passo a passo:

  1. Em Meu Computador acione o Painel de Controle e encontre o ícone ODBC 32 bits clicando sobre ele
Na tela do ODBC data Source Administrator selecione a opção ADD para incluirmos um novo Data Source ao nosso ambiente.
 
A seguir dentre os drivers instalados em sua máquina selecione um driver adequado a base de dados que quer acessar , no nosso caso uma base access. Selecione então Microsoft Access Driver (*.mdb).
Clique no botão concluir e na tela do ODBC Microsoft Access Setup clique no botão Select , para selecionar a base de dados que queremos acessar.
Selecione o diretório e a base de dados desejada e clique no botão OK. Para o nosso exemplo : c:\teste\Biblio.mdb
A seguir forneça o nome para o Data Source: usamos o nome teste_dsn e clique em OK. Se tudo estiver correto a tela mostra o seu Data Source Name criado pronto para ser usado.
Pronto já temos um DSN ( Data Source Name) configurado e instalados em nosso ambiente .
Para acessar uma base de dados usando o DSN configurado podemos usar os passos a seguir :
1-) Declaramos as variáveis objeto Connection e objeto Recordset 
2-) A seguir abrimos a base de dados e o objeto Recordset com o qual queremos trabalhar
  Dim db As Connection
  Dim adoPrimaryRS As Recordset
  Set db = New Connection
  db.CursorLocation = adUseClient
  db.Open "PROVIDER=MSDASQL;dsn=asp_db;uid=;pwd=;"
  Set adoPrimaryRS = New Recordset
  adoPrimaryRS.Open "select Au_ID,Author,[Year Born] from Authors", db, adOpenStatic, adLockOptimistic
Conteúdo 

ADO - Alterando , Excluindo , Incluindo e Procurando registros ...

Vamos mostrar um exemplo prático usando ADO para realizar a manutenção em uma base de dados Access. Usaremos o banco de dados Biblio.mdb que acompanha o Visual Basic. Vamos copiar o arquivo para o diretório c:\teste de forma que o nosso caminho completo será : C:\teste\biblio.mdb .

Iremos trabalhar com a tabela Authors do banco de dados Biblio.mdb. Só para recordar a estrutura desta tabela é:

O projeto em tempo de execução tem a seguinte aparência:

Vejamos agora o projeto em fase de desenvolvimento mostrando os controles usados :

Vejamos agora o código comentando do projeto:

1-) Secção General Declarations

Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset

Declaramos as variáveis Connection ( cnn ) e Recordset ( rst ) nesta secção para que sejam visíveis por todas as procedures do formulário

2-) Secção Form_load()

Private Sub Form_Load()

    'Abre a conexão
    cnn.Open "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=C:\teste\biblio.mdb;"

    'Abre o Recordset
    rst.CursorLocation = adUseClient
    rst.Open "Select * From Authors", cnn, adOpenKeyset, adLockOptimistic, adCmdText
    load_rec
    Text4.Text = Format(Time(), "hh:mm:ss")
    
End Sub

Durante a carga do formulário abrimos a conexão com a base de dados Biblio.mdb e a seguir o criamos o Recordset selecionando todos os registros da tabela Authors. O recordset foi definido como do tipo adOpenKeyset cujo comportamento é idêntico ao Dynaset da DAO. As alterações , inclusões e exclusões feitas por outro usuário não irão ser refletidas no Recordset.

O tipo de bloqueio usado foi o adLockOptmistic pois desejamos poder atualizar os registros da tabela. Aqui o registro é bloqueado somente enquanto a ADO faz a atualização física do registro.

A chamada a procedure load_rec preenche as caixas de textos com os valores do registro atual do recordset. A caixa de texto text4.text mostra um relógio atualizado a cada segundo.

3-) Procedure Load_rec

Private Sub load_rec()
    Text1.Text = "" & rst.Fields(0)
    Text2.Text = "" & rst.Fields(1)
    Text3.Text = "" & rst.Fields(2)
    Text5.Text = rst.AbsolutePosition
    Text6.Text = rst.RecordCount
End Sub

Esta procedure atribui a cada TextBox os valores dos registros do Recordset. Como a tabela Authors possui os campos Au_ID, Author e Year Born a coleção Fields(0), Fields(1) e Fields(3) reflete os valores dos campos no Recordset.

Usamos as propriedades AbsolutePosition e RecordCount para mostrar o registro atual e o total de registro do Recordset..

4-) A movimentação pelo Recordset é feita pelas propriedades MovePrevious, MoveFirst, MoveLast, MoveNext.

Private Sub Command1_Click()
  rst.MovePrevious
  If rst.BOF Then
    MsgBox "Calma chegamos ao inicio do arquivo"
    rst.MoveNext
    Exit Sub
  End If
  load_rec
End Sub
 
Private Sub Command2_Click()
  rst.MoveNext
  If rst.EOF Then
   MsgBox "Calma chegamos ao fim do arquivo "
   rst.MovePrevious
   Exit Sub
  End If
  load_rec
End Sub		
 
Private Sub Command3_Click()
rst.MoveFirst
load_rec
End Sub					
 
Private Sub Command4_Click()
rst.MoveLast
  If rst.BOF Then
    MsgBox "Calma chegamos ao fim do arquivo"
    rst.MovePrevious
    Exit Sub
  End If
  load_rec
End Sub					

5-) Procedure para procurar registros no Recordset

Private Sub Command6_Click()
   Dim resposta As String
   Dim marca As Variant
   resposta = InputBox("Informe o codigo do autor a localizar ", "Localizar", "1", 1800, 3000)
   If resposta <> "" Then
      marca = rst.Bookmark
   Else
      Exit Sub
   End If
   rst.Find "Au_ID=" & resposta
   If rst.EOF Then
       MsgBox "Não encontrei o codigo " & resposta
       rst.Bookmark = marca
       Exit Sub
   End If
   load_rec
End Sub

Usamos o método Find para procurar registros no recordset criado. Usamo o campo Au_ID ( codigo do autor) pois o mesmo é uma chave primária evitando assim registros duplicados.

Lembre-se que a ADO possui somente o método Find ( A DAO possui ainda o FindFirst, FindLast, FindNext e FindPrevious ) e sempre inicia a busca a partir do registro atual. A direção da busca é fornecida com a utilização de parâmetros, os quais podem ser relacionados com os outros métodos da DAO conforme tabela abaixo:

metodo DAO ADO direção da busca
FindFirst adSearchForward (Se não estiver posicionado no primeiro registro, invoque o método MoveFirst antes do Find)
FindLast adSearchBackward (Se não estiver posicionado no último registro ,invoque o método l MoveLast antes do Find)
FindNext adSearchForward
FindPrevious adSearchBackward

Existe uma diferença basica entre DAO e ADO para localizar registros com valor NULL.

Ao utilizar a DAO a sintaxe usada é:

"ColumnName Is Null" ou "ColumnName Is Not Null"

Como ADO não reconhece o operador Is devemos usar os operadores ( = ) ou ( <> ), assim ficamos com:

"ColumnName = Null" ou "ColumnName <> Null"

A DAO possui a propriedade NoMatch que é usada para saber se a busca foi bem sucedida ou não . ADO não possui a propriedade NoMatch , para obtermos o mesmo efeito na ADO devemos usar as propriedades BOF e EOF.

A propriedade BookMark identifica unicamente cada registro do recordset . Assim antes de iniciar a busca definimos uma variável do tipo variant que irá identificar o registro atual.(marca = rst.bookmark) Se o código desejado não for localizado no arquivo posicionamos o ponteiro no registro marcado.( rst.Bookmark = marca ).

5-) Procedure para incluir registros no recordset

Private Sub Command9_Click()
On Error GoTo trataerro
If Command9.Caption = "&Inclui" Then
   rst.AddNew
   clear_ctrls
   Text1.SetFocus
   Command9.Caption = "&Grava"
   Exit Sub
End If
If Command9.Caption = "&Grava" Then
   grava_rec
   rst.Update
   Command9.Caption = "&Inclui"
   marca = rst.Bookmark
   rst.Requery
   rst.Bookmark = marca
   load_rec
   MsgBox "Inclusão gravada ! "
End If
Exit Sub

Para incluir registros em recordset ADO usamos a propriedade AddNew , a seguir limpamos os controles textbox ( clear_ctrls) deixando-os preparados para que o usuário entre com o dados e quando o usuário clicar no botão Gravar atribuimos os dados informados aos campos do recordset ( grava_rec ) e gravamos efetivamente os dados no arquivo via método Update. Basicamente esta será sempre a sequência para a gravação de um novo registro em um recordset ADO.

6-) Procedure para excluir registros no recordset

Private Sub Command7_Click()
  If (MsgBox("Deseja excluir - " & rst.Fields(1), vbYesNo, "Jcmsoft")) = vbYes Then
    rst.Delete
    rst.MovePrevious
    If rst.BOF Then
      MsgBox "Voce chegou no inicio do arquivo ! "
      Exit Sub
    Else
      load_rec
    End If
  End If
End Sub

Para excluir um registro usamos o método Delete e após a exclusão do mesmo movemos o ponteiro do registro para um registro válido.

7-) Procedure para Alterar registros no recordset

Private Sub Command8_Click()
  On Error GoTo trataerro
  If Command8.Caption = "&Altera" Then
   Text1.SetFocus
   Command8.Caption = "&Grava"
   Exit Sub
  End If
  If Command8.Caption = "&Grava" Then
    grava_rec
    rst.Update
    Command8.Caption = "&Altera"
    MsgBox "Alteração gravada ! "
  End If
  Exit Sub

trataerro:
  MsgBox "Ocorreu um erro no arquivo "
  Resume
End Sub

Para atualizar um registro de um recordset ADO , basta apenas se posicionar no registro desejado e fazer a alteração , atribuir a alteração aos campos do recordset e invocar o método Update - A ADO não posui o método Edit . Na verdade se você se posicionar no registro e alterá-lo ao se mover para outro registro sem usar o Update a ADO atualiza o registro automaticamente.

Para abandonar uma edição podemos usar o método CancelUpdate.

8-) Procedure para Atribuir os dados aos campos do recordset.

Private Sub grava_rec()
   'rst.Fields(0) = "" & Text1.Text
   rst.Fields(1) = "" & Text2.Text
   rst.Fields(2) = "" & Text3.Text
End Sub

9-) Procedure para limpar as caixas de texto

Private Sub clear_ctrls()
   Text1.Text = ""
   Text2.Text = ""
   Text3.Text = ""
End Sub

10-) Procedure para visualizar o temporaziador ,mostrando um relógio atualizado na caixa de texto

Private Sub Timer1_Timer()
  Text4.Text = Time
End Sub

Naturalmente você deve inserir um controle Timer no formulário e definir a propriedade Interval para 1000.

Lembre-se ! , este projeto é apenas um pequeno exemplo que procura mostrar de forma simples e objetiva como dar manutenção em uma base de dados usando ADO. Ele pode e deve ser em muito aperfeiçoado para utilização em um projeto 'pra valer'.

Por enquanto é só. Clique no link para 'baixar' o projeto exemplo.

ado_demo.zip (4 KB)


Retorna