Caso você ainda não tenha lido a segunda parte, voce pode acessá-la em ADO ADOX (ActiveX Data Objects).
2.2 Abrindo, fechando e limpando um recordset
Antes de abrir um recordset é necessário a abertura de uma conexão, a menos que você queira utilizar um recordset desconectado (veja mais adiante como proceder).
Recordset está vinculado à base de dados e por este motivo precisamos da conexão aberta antes de proceder, sem isso a abertura de um recordset falhará.
Assim como a conexão, nós utilizamos o método Open para abrir o recordset e o método Close para fechá-lo.
Vejamos então um exemplo simples de como proceder:
Sub exRecordset ()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strCn As String
strCn = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;"
strCn = strCn & "Data Source=C:\Northwind.mdb;"
cn.Open strCn
rs.Open "SELECT * FROM Categorias", cn, adOpenKeyset, adLockPessimistic
Debug.Print rs.Fields.Count
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End Sub
Quando iniciamos o processo de abertura de um recordset nós precisamos determinar alguns argumentos utilizados pelo método Open conforme mostra a figura abaixo:
Figura 2‑1 Argumentos do métodos Open

· Source à Refere-se à fonte de dados para o recordset. Para ser mais específico, Source refere-se a uma instrução SQL a qual retornará os registros que desejamos. No exemplo acima, a instrução é de seleção (SELECT) de todos os registro (*) da tabela Categorias. A complexidade da instrução dependerá do tipo recordset que você deseja;
· ActiveConnection à Refere-se à conexão que utilizaremos para retornar os dados;
· CursorType à Refere-se ao tipo de cursor utilizado. O cursor determina como podemos movimentar dentro dos registro. Por exemplo, o cursor adOpenForwardOnly somente permite movimento para frente dentro do recordset o que implica que não podemos utilizar o método MovePrevious do recordset para mover para o registro anterior ao atual na ausência de um lock, pois neste contexto não é permitido;
· LockType à Refere-se ao travamento dos registros para edição. Imagine o cenário onde um usuário acessa um registro agora para edição e outro acessa os mesmos dados dois segundos depois, o que ocorreria? Sem o devido travamento edições feitas por um usuário podem ser sobrescritas por outro. Para evitar isso, travamos os registros. adLockPessimistic pode ser usado para evitar acesso/edição simultânea ao passo que adLockOptimistic permitiria acesso e que um registro seja editado e salvo dependendo de qual usuário chama primeiro a execução do comando.
É basicamente isso que o leitor precisa saber para abrir um recordset. A maior dificuldade é realmente construir a instrução SQL que executará o que desejamos. Veja apêndice para maiores informações.
2.3 Abrindo, fechando e limpando um recordset desconectado (disconnected recordset)
No exemplo anterior vimos como abrir um recordset conectado, isto é, ele está conectado à base de dados sem a qual ele não existe. Por outro lado, um recordset desconectado implica que o mesmo não depende de uma conexão para existir.
Recordset desconectado serve uma função similar a uma matriz. Por exemplo, poderíamos ter a seguinte matriz
Matriz(0) = 0
Matriz(1) = 1
Matriz(2) = 3
Enquanto que não há nada de errado em criar uma matriz, até porque nós podemos redimensioná-la e preservar os itens existentes, um recordset desconectado pode nos servir bem para tal cenário, pois podemos adicionar campos a ele e depois apenas adicionamos os dados que desejamos (os quais podem vir de uma fonte conectada).
Vejamos como isso é feito:
Sub exRecordsetDesconectado()
Dim rs As New ADODB.Recordset
With rs.Fields
.Append "ID", adInteger
.Append "Nome", adVarChar, 55
.Append "Endereço", adVarChar, 255
.Refresh
End With
With rs
.Open
.AddNew
!ID = 100
!Nome = "Robert Friedrick Martim"
!Endereço = "Qualquer lugar"
.Update
End With
Debug.Print rs.Fields(1).Name
Debug.Print rs.Fields(1).Value
rs.Close
Set rs = Nothing
End Sub
O leitor provavelmente está se perguntando para que serve isso. Suponha que você deseja abrir um recordset, porém, como já sabemos, o mesmo estará conectado a base de dados o que nos causa um pequeno problema.
Uma solução seria declarar um recordset na área de declarações globais (no topo de tudo na janela do VBE) e armazenar os dados de um recordset conectado neste recordset global desconectado. Como ele não será destruído enquanto não for explicitamente feito, podemos utilizá-lo para trabalhar os dados sem a necessidade de solicitá-los várias vezes à fonte de dados.
Alternativamente, podemos utilizar o recordset desconectado para simplesmente armazenar uma matriz muito grande a qual não sabemos o limite superior de antemão, mas sabemos o número de colunas o que evitaria redimensionamento desnecessário de matriz (além da necessidade de preservar informações já contidas nela como um Redim Preserve).
2.4 Navegação de um recordset
No tópico sobre abertura de um recordset vimos brevemente o tipo de cursor que podemos utilizar nele. Agora, veremos como estes cursores afetam a navegação pelos registros.
Navegar pelo registros é bastante simples e precisamos apenas observar o tipo de cursor que desejamos utilizar e sua combinação com o tipo de lock do banco de dados para evitar erros.
Vejamos um exemplo:
Sub exNavegacao()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
cn.Open strCn
With rs
.Open "SELECT * FROM Categorias", cn, adOpenKeyset, adLockOptimistic
.MoveFirst
Do While Not .EOF
Debug.Print !NomeDaCategoria
.MoveNext
Loop
Debug.Print vbCr
.MovePrevious
Do Until .BOF
Debug.Print !NomeDaCategoria
.MovePrevious
Loop
End With
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End Sub
No exemplo acima listamos as categorias do início ao fim e depois do fim até o início. Os métodos utilizados na navegação são:
· MoveFirst à Move o cursor para o primeiro registro do recordset;
· MoveNext à Move o cursor para o próximo registro do recordset dado o registro atual;
· MovePrevious à Move o cursor para o registro anterior do recordset dado o registro atual;
Poderíamos também utilizar MoveLast o qual teria o efeito oposto do método MoveFirst.
Caso o leitor tente utilizar adOpenForwardOnly sem um lock apropriado um erro ocorrerá conforme já explicado:

Figura
2‑2 Método MovePrevious inválido na ausência de um lock e cursor adOpenForwardOnly