segunda-feira, 7 de março de 2011

Executando múltiplas consultas usando um objeto Command

Pensando em um contexto de uma aplicação que executa múltiplas consultas em um banco de dados, e que deve evitar o máximo o consumo de recursos adicionais, é que resolvemos escrever este artigo. A idéia é utilizar somente um objeto Command para realizar as consultas e obter os resultados usando um objeto DataReader. 

Crie um novo projeto do tipo Web Site no Visual Studio (File > New > Web Site) em linguagem C#. 



Clique na aba Design da página Default.aspx do projeto e altere o fonte HTML conforme a listagem abaixo.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body style="font-family: Trebuchet MS;">
    <form id="form1" runat="server">
    <div>
        <b>Listagem de Produtos</b><br />
        <asp:ListBox ID="lstProduto" runat="server" Height="169px" Width="284px"></asp:ListBox><br /><br />
        <b>Listagem de Categorias</b><br />
        <asp:ListBox ID="lstCategoria" runat="server" Height="169px" Width="284px"></asp:ListBox><br />
    </div>
    </form>
</body>
</html>

Acesse o code-behind da página pressionando a tecla F7 e escreva as linhas de código abaixo.


protected void Page_Load(object sender, EventArgs e)
{
    try
    {
        if (!Page.IsPostBack)
            this.ExecutarMultiplaConsulta();
    }
    catch (Exception ex)
    {
        ScriptManager.RegisterStartupScript(thisthis.GetType(), "erro",
                string.Format("alert('{0}');", ex.Message), true);
    }
} 

private void ExecutarMultiplaConsulta()
{
    using (SqlConnection con =
        new SqlConnection(ConfigurationManager.ConnectionStrings["connStringSqlServer"].ToString()))
    {
        using (SqlCommand cmd =
            new SqlCommand("SELECT * FROM Products; SELECT * FROM Categories", con))
        {
            cmd.CommandType = System.Data.CommandType.Text;
            con.Open();
            SqlDataReader dr = cmd.ExecuteReader();
            //Preencher o primeiro ListBox com os produtos
            while (dr.Read())
            {
                lstProduto.Items.Add(dr["ProductName"].ToString());
            }
            //Obter o resultado da próxima query
            dr.NextResult();
            //Preencher o segundo ListBox com as categorias
            while (dr.Read())
            {
                lstCategoria.Items.Add(dr["CategoryName"].ToString());
            }
        }
    }
}

Antes de tudo, precisei criar uma connection string apontando para um servidor SQL Server local. Segue a configuração do arquivo web.config.


<connectionStrings>
<add name="connStringSqlServer" connectionString="Data Source=.\SQLEXPRESS; Initial Catalog=Northwind; Trusted_Connection=True;"providerName="System.Data.SqlClient"/>
</connectionStrings>

Perceba que alimentamos o objeto SqlCommand com duas querys separadas por “;” ponto-e-vírgula. O outro detalhe importante, é que após o preenchimento doListBox lstProduto, chamamos o método NextResult do SqlDataReader para que o mesmo selecione o resultado da segunda query. Testando a aplicação, teremos um resultado conforme a imagem a seguir.

Concluindo, conseguimos executar duas consultas no banco de dados, usando os mesmos objetos que seriam utilizados para uma única consulta. 
Por enquanto é só. 

Até o próximo artigo!

Um comentário:

Deixe aqui seu comentário