VB2005 - Preenchendo um Array a partir de um DataReader


Embora o Visual Basic 2005 (leia-se .NET Framework 2.0) tenha trazido muitas novidades o código usado na versão anterior (.NET Framework 1.1) é totalmente compatível e roda sem problemas.

Este artigo se propõe a mostrar como você pode usar alguns dos novos recursos do VB2005 com alguns dos objetos clássicos do VB. Nele vou mostrar como você pode preencher um ArrayList com os dados obtidos de uma fonte de dados SQL Server 2005 usando uma stored procedure e exibir o conteúdo do ArrayList em um ListBox.

Para acompanhar este artigo você vai precisar ter os seguintes recursos instalados:

As tarefas que iremos realizar para completar o artigo são:

  1. Criar um projeto do tipo Windows Application no VB2005

  2. Criar uma base de dados chamada Estoque.mdf

  3. Criar a tabela Produto com os seguintes campos: Codigo,Nome,Descricao,

  4. Criar uma stored Procedure que receba um parâmetro de entrada inteiro

  5. Efetuar a conexão com a fonte de dados e gerar um datareader

  6. preencher um ArrayList com os dados do datareader

  7. Exibir os dados em um ListBox

Embora simples, vimos que temos muita coisa a fazer e a aprender.

1- Inicie um novo projeto no VB 2005 com o nome de dtrArray. No formulário padrão inclua um controle ListBox e um controle Button conforme figura abaixo:

2- Clique com o botão direito do mouse sobre o nome do projeto e selecione Add -> New Item. Na janela Add New Item selecione : SQL DataBase e informe o nome Estoque.mdb

Este é um recurso novo, e, permite que você crie o banco de dados vinculado ao seu projeto.

Abra a janela DataBase Explorer e expanda os objetos do banco de dados Estoque.mdf.  A seguir clique com o botão direito do mouse sobre o objeto Tables e selecione a opção - Add New Table

Será aberta a janela onde você deverá criar a estrutura da tabela informando o nome de campo e seu tipo de dados conforme figura abaixo:

Nota : O campo Codigo é do tipo int Identity com Identity Increment igual a 1 e identity Seed igual a 1.

Ao terminar salve a tabela com o nome Produto. Retornando ao DataBase Explorer você verá nos detalhes do objeto Table os campos criados.

Vamos incluir alguns dados na tabela Produto. Para isto Clique com o botão direito sobre o nome da tabela e selecione a opção - Show Table Data.(Fig 1.0). A seguir informe os dados digitando diretamente os valores em cada linha conforme abaixo (Fig. 2.0):

Fig 1.0 - Seleção para exibir dados Fig. 2.0 - Digitando alguns dados na tabela

Vamos agora criar uma stored Procedure em nossa base de dados.  A stored procedure será chamada ProdutosCategoria e irá receber um parâmetro do tipo Inteiro correspondente ao código da categoria do produto efetuando assim a seleção somente dos produtos para esta categoria.

Para criar uma nova stored Procedure abra a janela DataBase Explorer e clique com o botão direito do mouse sobre o objeto Stored Procedures e selecione a opção : Add New Stored Procedure.

Na janela a seguir digite o código da stored procedure conforme abaixo. Onde @codigoCategoria é o parâmetro do tipo int que será informado.

Após salvar a stored Procedure a janela DataBase Explorer irá exibir os objetos criados conforme abaixo:

Já temos tudo pronto : o banco de dados , a tabela e a stored procedure. Vamos a código. Dando uma última espiada na estrutura do formulário e da solução iremos ver:

No evento Click do botão de comando - Button1 - do formulário inclua o seguinte código:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 

Dim traco As String = "#-------------------------------------------"


Dim
con As SqlConnection = New SqlConnection(My.Settings.ProdutosConnectionString)

 

Dim cmd As SqlCommand = New SqlCommand("ProdutosCategoria", con)


cmd.CommandType = CommandType.StoredProcedure

cmd.Parameters.Add(New SqlParameter("@codigoCategoria", SqlDbType.Int)).Value = 3


con.Open()


Dim
arl As ArrayList = New ArrayList


Dim
dr As SqlDataReader = cmd.ExecuteReader

 

'preenche o ArrayList com os valores do datareader
While
dr.Read

   Dim values(dr.FieldCount - 1) As Object

   dr.GetValues(values)

   arl.Add(values)

End While

 

dr.Close()

con.Close()

 

'Percorre os ArrayList e exibe os valores no ListBox

For Each linha As Object() In arl

   For Each coluna As Object In linha

      ListBox1.Items.Add(coluna.ToString)

   Next

ListBox1.Items.Add(traco)

Next


End
Sub

Note que estou usando o recurso My para obter a string de conexão :

Dim con As SqlConnection = New SqlConnection(My.Settings.ProdutosConnectionString)

O código define um objeto Command que faz referência a nossa stored Procedure criada; sendo que o parâmetro informado tem valor igual a 3, e, esta fixo no código. Com isto somente os produtos com categoria cujo código seja igual a 3 serão retornados.

Nota: O valor do parâmetro poderia ser fornecido dinamicamente mas por questão de simplicidade deixamos o valor fixo no código

Dim cmd As SqlCommand = New SqlCommand("ProdutosCategoria", con)

cmd.CommandType = CommandType.StoredProcedure

cmd.Parameters.Add(New SqlParameter("@codigoCategoria", SqlDbType.Int)).Value = 3

O resto do código esta comentado e é muito simples. O resultado final obtido será:

Desde que a conexão não pode ser usada até que o DataReader esteja fechado, lemos o conteúdo do mesmo para um array e então fechamos o DataReader. Desta forma podemos processar os dados no array enquanto a conexão pode ser usada para outras finalidades.

Pegue o projeto aqui :  dtrArray.zip (Sem o banco de dados)

Até o próximo artigo...

referências:

- ASP .NET - Usando um ArrayList - Como usar o controle ArrayList. Propriedades básicas e exemplo.
- VB .NET - Arrays. - Arrays no VB.NET o que mudou ? Propriedades , métodos , exemplos ; arrays de arrays , array de objetos.
- ADO.NET - Obtendo quantos registros um DataReader/DataSet vai retornar
- VB.NET - DataReader : preenchendo um ListView com dados
- ADO.NET - DataSet x DataReader - Uma questão de desempenho ?


José Carlos Macoratti