ADO - ACTIVE DATA OBJECTS
Conteúdo
- Um pouco de história.
- ADO - Um pouco de teoria.
- ADO - Exemplo usando um DSN
- ADO - Alterando, Incluindo , Excluindo e Procurando registros...
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:
- Errors - contém os erros gerados durante uma conexão.
- Properties - representa o conjunto de propriedades para uma conexão
O objeto Connection contém os seguintes métodos.
- BeginTrans - inicia uma transação, se a base de dados suportar o processsamento de transações.
- Close - Encerra uma conexão.
- CommitTrans - Encerra uma transação.
- Execute - executa um comando SQL.
- Open - abre uma conexão para uma fonte de dados.
- RollbackTrans - Cancela e desfaz uma transação.
O objeto Connection contém as propriedades dadas a seguir:
- Attributes - Lê os valores de XactAttributeEnum para uma conexão.
- CommandTimeout - Determina o tempo de espera por um comando antes de gerar um erro.
- ConnectionString - Contém a informação necessária para estabelecer uma conexão , tal como um nome DSN ou uma senha.
- ConnectionTimeout - Determina o tempo de espera quando da tentativa de uma conexão antes de gerar um erro.
- DefaultDatabase - Indica a base de dados padrão para uma conexão.
- IsolationLevel - Lê ou determina o nível de isolação de uma transação.
- Mode - indica as permissões disponíveis em uma conexão para modificar dados.
- Provider - Indica o provedor OLE DB para uma conexão.
- 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:
- Description - explica o erro detalhando-o.
- HelpContext - retorna uma variável de contexto ID como um inteiro longo associado a um tópico do arquivo de HELP.
- HelpFile - retorna o caminho do arquivo de HELP
- NativeError - indica o código de erro específico do provedor para um objeto error.
- Number - indica o número do erro.
- Source - informa o nome do objeto que gerou o erro.
- SQLstate - retorna uma string de cinco caracteres no padrão SQL ANSI.
A coleção Errors possue um método:
- Clear - remove todos os erros dos objetos Error na coleção.
A coleção Errors tem duas propriedades:
- Count - indica o número total dos objetos Error.
- 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:
- ActiveConnection - indica o objeto Connection ao qual o objeto Command esta associado
- CommandText - Contém o texto de um comando SQL
- CommandTimeout - Determina o tempo de espera durante a tentativa de estabelecer uma conexão.
- CommandType - Contém o tipo de Comando.(Stored Procedure, comando SQl, etc..)
- 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:
- CreateParameter - Cria um novo objeto Parametro
- Execute - Executa o comando , consulta SQL ou stored procedure informada na propriedade CommandText
O objeto Command possui duas coleções:
- Parameters - A coleção dos objetos parametros do objeto Command.
- 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:
- Attributes - é a soma de um ou de mais de um dos valores de ParameterAttributesEnum
- Direction - Indica se o parâmetro representa um parâmetro de entrada de saída, ambos ou o retorno de uma stored Procedure.
- Name - O nome do parâmetro que pode ser usado como referência.
- NumericScale - Determina ou retorna o número de casa decimais usadas
- Precision - Determina ou retorna o número máximo de dígitos usados enm valores numéricos.
- Size - Tamanho máximo em bytes ou caracteres
- Type - O tipo de dados do objeto parameter
- Value - O valor associado ao objeto parameter
O objeto Parameter possui um método
- AppendChunck - Usado para passar dados do tipo long binary ou long Character .
A coleção Parameters possui três métodos:
- Append - Anexa um objeto Parameter à coleção.
- Delete - Remove o objeto Parameter da coleção.
- 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 :
- Internas - implementadas no ADO e imediatamente disponíveis para qualquer novo objeto. Elas não aparecem como objetos Property em uma coleção Properties.
- Dinâmicas - definidas pelo provedor. Aparecem na coleção Properties do objeto ADO.
O objeto Property possui 4 propriedades:
- Attributes - indica as características da propriedade específica do provedor.
- Name - o nome da propriedade
- Type - o tipo de dados da propriedade
- 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:
- Dynamic Cursor - Permite a movimentação através do Recordset , ver adições, alterações e excluções feitas pelo usuário.
- Keyset Cursor - Idêntico a Dynamic Cursor ; somente não permite acesso a registros adicionados ou excluídos por outro usuário.
- 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)
- Forward-only Cursor - Idêntico ao Dynamic Cursor ; permitindo somente a movimentação para a frente.
O objeto recordset possui duas coleções:
- Fields - Contém todos os Objetos Fields do objeto Recordset
- Properties - Contém todas os objetos Property para uma instância específica do objeto Recordset.
O objeto recordset possue dezenove métodos:
- Addnew - Cria um novo registro
- CancelUpdate - Cancela atualizaçoes pendentes
- Clone - Cria uma cópia de um objeto recordset
- Close - Fecha um objeto recordset
- Delete - Exclui o registro atual de um objeto recordse aberto.
- GetRows - Retorna múltiplos registros de um recordset em um vetor.
- Move - Muda a posição do registro atual.
- MoveFirst - Muda a posição do registro para o primeiro registro do recordset e o torna o registro atual.
- MoveLast - Muda a posição do registro para o último registro do recordset e o torna o registro atual.
- MoveNext - Muda a posição do registro para o próximo registro.
- MovePrevious - Muda a posiçãodo registro para o registro anterior.
- MoveNextRecordset - Retorna o próximo objeto recordset.
- Open - Abre um Cursor.
- Requery - Atualiza os dados de um recordset executando novamente a consulta que o gerou.
- Resync - Atualiza os dados de um objeto recordset.
- Supports - Informa a funcionalidade que o objeto recordset suporta.
- Update - Salva as alterações feitas no registro atual.
- UpdateBatch - Escreve todas as atualizações pendentes em lote para o disco.
O objeto Recordset contém dezessete propriedades:
- AbsolutePage - Informa o número da 'página' de localização do registro atual.
- AbsolutePosition - Determina a posição do registro atual.
- ActiveConnection - Informa a qual conexão o objeto recordset pertence.
- BOF - Informa que o registro atual está antes do primeiro registro.(Início do Arquivo)
- Bookmark - Retorna o bookmark que identifica o registro atual ou atribui ao registro atual o bookmark de um outro registro do recordset.
- CacheSize - Informa o número de registros do recordset que estão na memória.
- CursorType - Informa o tipo de cursor usado em u recordset.
- EditMode - Mostra o status da edição que esta sendo realizada no registro atual.
- EOF - Informa que o registro atual está posicionado depois do último registro.(Fim de Arquivo)
- Filter - Informa um filtro para os dados em um recordset.
- LockType - Informa o tipo de bloqueio dos registros durante a edição.
- MaxRecords - Informa o número máximo de registros que serão retornados de uma consulta.
- PageCount - Informa o número de páginas de dados que um recordset contém.
- PageSize - Mostra quantos registros constituem uma página no recordset.
- RecordCount - Informa o número de registros em um recordset.
- Source - Informa a fonte de dados em um objeto recordset ou o nome do objeto ou aplicação que gerou um erro.
- 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:
- AppendChunck - Anexa dados para um objeto Field binário ou Texto.
- GetChunck - Retorna o contéudo de um objeto Field binário ou Texto.
O objeto Field possui dez propriedades:
- ActualSize - Informa o tamanho atual de um campo válido.
- Attributes - Informa uma ou mais características do objeto Field.
- DefinedSize - Informa o tamanho definido de um objeto Field.
- Name - Informa o nome do objeto Field
- NumericScale - Determina ou retorna o valor que indica o número de casas decimais para valores numéricos.
- OriginalValue - Informa o valor do campo que existe em um registro antes da alteração.
- Precision - Determina ou retorma o valor que indica o número máximo de dígitos usados para representar valores.
- Type - Informa o tipo de dados de um objeto Field.
- UnderlyingValue - Mostra o valor atual do objeto Field em um arquivo.
- 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á...
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:
- 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 Recordset2-) A seguir abrimos a base de dados e o objeto Recordset com o qual queremos trabalharDim db As Connection Dim adoPrimaryRS As Recordset Set db = New Connectiondb.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, adLockOptimisticConteúdoADO - 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.RecordsetDeclaramos 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 SubDurante 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 SubEsta 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 Sub5-) 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 SubUsamos 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 SubPara 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 SubPara 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 SubPara 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 Sub9-) Procedure para limpar as caixas de texto
Private Sub clear_ctrls() Text1.Text = "" Text2.Text = "" Text3.Text = "" End Sub10-) Procedure para visualizar o temporaziador ,mostrando um relógio atualizado na caixa de texto
Private Sub Timer1_Timer() Text4.Text = Time End SubNaturalmente 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.