ADO - Trabalhando com múltiplos conjuntos de dados (Multiple Result Sets)


A ADO - Active Data Objects - pode retornar mais de um conjunto de registros para um único objeto Recordset. Vamos explicar melhor ...

Você pode usar uma instrução SQL com mais de um comando SELECT ao mesmo tempo separados por ponto e vírgula. Isto irá gerar mais de um conjunto de registros para o mesmo recordset. É como se os conjuntos de registros gerados ficassem em uma 'fila'. Abaixo temos um exemplo de sintaxe para usar Múltiplos conjuntos de registros:

SQL = "SELECT ...... ;SELECT....;SELECT..."

objRS.Open SQL

Após executar o método Open teremos uma fila com os múltiplos conjuntos de registros selecionados , cada um correspondendo ao respectivo comando SELECT . Os conjuntos de registros são retornados em ordem , assim o primeiro conjunto corresponde ao primeiro comando SELECT.

Para usar o próximo conjunto de registros da 'fila' usamos o método NextRecordset.

O método NextRecordset retorna o próximo conjunto de registros presente no objeto Recordset. Se não houver mais nenhum conjunto de registros será retornado Nothing.

A utilização de Múltiplos conjuntos de registros nos dá duas grandes vantagens :

  1. Não precisamos abrir novamente a conexão para cada conjunto de registros que desejamos retornar
  2. O processamento dos conjuntos de registros feitos desta forma é muito mais rápida

Para poder usar esta característica da ADO precisamos ter o seguinte:

Um exemplo Prático

Vamos agora a um exemplo prático mostrando a utilização dos Múltiplos conjuntos de registros.

Vamos usar uma conexão com o Banco de dados SQL Server 2000 e acessar a tabela Pubs retornando dois conjuntos de registros para o recordset :

1- Inicie um novo projeto no Visual Basic e no formulário padrão insira os controles conforme a figura abaixo:

A idéia é acessar o banco de dados Pubs e gerar dois conjunto de registros , retornando cada um para um respectivo ListBox conforme identificado na figura.

Precisamos saber o nome do Servidor , o nome do banco de dados , o nome o usuário e da sua senha.

2-) Insira o seguinte código na seção General Declarations do formulário para declarar as variáveis usadas.

Dim usuario, senha, servidor, BancoDados As String
Dim sql As String
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset

3-) Agora no evento click do botão de comando -command1 - Conexão - inclua o código abaixo:

Private Sub Command1_Click()

usuario = txtusuario.Text
senha = txtsenha.Text
servidor = txtservidor.Text
BancoDados = txtbancobd.Text

cn.Provider = "SQLOLEDB"
cn.Properties("Data Source").Value = servidor
cn.Properties("Initial Catalog").Value = BancoDados
cn.Properties("User ID").Value = usuario
cn.Properties("Password").Value = senha

cn.Open
MsgBox " Conexao efetuada com sucesso ! "
Command2.Enabled = True
Command1.Enabled = False

End Sub

Este código efetua a conexão com o banco de dados Pubs no servidor MACORATI\MACORATTI usando o usuário sa.

4-) Agora para gerar os conjuntos de registros para o Recordset inclua o seguinte código no evento Click do botão de comando - command2 - Gerar Registros.

Private Sub Command2_Click()
Set rs = New ADODB.Recordset

sql = "SELECT au_fname, au_lname FROM authors;SELECT title FROM Titles"

rs.Open sql, cn

List1.Clear
Do While Not rs.EOF
   List1.AddItem rs.Fields("au_lname") & ", " & rs.Fields("au_fname")
   rs.MoveNext
Loop

Set rs = rs.NextRecordset

List2.Clear
Do While Not rs.EOF
   List2.AddItem rs.Fields("title")
   rs.MoveNext
Loop
rs.Close
Set rs = Nothing

End Sub

- Usamos a instrução SQL com duas instruções SELECT

- Preenchemos o primeiro Listbox - List1 - com o primeiro conjunto de registros

- Mudamos para o segundo conjunto de registros usando o método : Set rs = rs.NextRecordset

- Preenchemos o segundo Listbox - List2 - com os dados do segundo conjunto de registros.

O resultado obtido seria algo parecido com o exibido a seguir:

Até mais


 José Carlos Macoratti