Você está na página 1de 5

ADO .

NET - Executando Mltiplos Comandos em uma nica conexo


Se voc usa o objeto DataReader em seus aplicativos e tentou utilizar mais de um comando em uma conexo aberta j deve ter visto a mensagem de erro : "There is already an open DataReader associated with this Command which must be closed first." ("J existe um DataReader aberto associado a esta conexo que deve ser fechado...." ) Ento no posso executar mais de um comando em uma mesma conexo ??? Pode, mas para isso voc tem que ativar o recurso MARS - Multiple Active Result Sets. O recurso MARS possibilita abrir mltiplos objetos SqlDataReader em uma nica conexo. Ele permite que um aplicativo tenha mais de um SqlDataReader aberto em uma conexo quando cada instncia do SqlDataReader iniciada a partir de um comando separado. Cada objeto SqlCommand que voc adicionar acrescenta uma sesso adicional para a conexo. O recurso MARS est disponvel em muitos SGBDs, sendo que o SQL Server 2005 foi o primeiro a dar suporte ao MARS. Voc pode controlar explicitamente a ativao do recurso utilizando um par de palavras-chave em sua seqncia de conexo. Para ativar o recurso MARS em sua conexo voc define explicitamente o atributo MultipleActiveResultSets na seqncia de conexo para True da seguinte forma: string northwindConnectionString = "Server=localhost;Database=Northwind;Trusted_Connection=True;Multiple ActiveResultSets=True"; Vou mostrar um exemplo prtico usando os seguintes recursos:

Visual C# 2010 Express Edition SQL Server 2008 Express Edition Banco de dados Northwind.mdf (attached)

Criando o projeto
Neste projeto exemplo vamos abrir dois DataReader usando dois comandos na mesma conexo:

Comando cmdOrder e DataReader drOrder - Obtm os 5 primeiros pedidos da tabela Orders;

Comando cmdDetail e DataReader drDetail - Obtm os detalhes do pedido para cada pedido na tabela Order Details;

Vamos criar um novo projeto no Visual C# 2010 Express Edition acionando o menu File -> New Project e a seguir escolhendo o template Windows Forms Application; Informe o nome MultiplosComandos_PorConexao e clique no boto OK; A seguir abra a janela Database Explorer e clique no cone Data Connections com o boto direito do mouse e selecione Add Connections; Na janela Add Connection escolha o Data Source - Microsoft SQL Server Database File (SqlClient) - e informe o local do banco de dados Northwind.mdf;

Obs: Eu estou anexando o banco de dados Northwind.mdf no meu SQL Server. Aps clicar no boto OK voc dever ter acesso a todos os objetos do banco de dados Northwind.mdf no SQL Server. No formulrio padro form1.cs inclua os seguintes controles:

ListBox - lstDados

Button - btnExecutar e btnEncerrar

Disponha os controles conforme o leiaute da figura a seguir:

Vamos declarar os seguintes namespaces no inicio do formulrio: using System; using System.Windows.Forms; using System.Data.SqlClient; Vamos definir a string de conexo e ativar o recurso MARS : string sqlConnectString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\Northwind.MDF;Integra ted Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True"; O cdigo do evento Click do boto Executar mostrado a seguir:

private void btnExecutar_Click(object sender, EventArgs e) { string sqlConnectString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\Northwind.MDF;In Instance=True;MultipleActiveResultSets=True"; SqlConnection connection = new SqlConnection(sqlConnectString); // cria o DataReader com 3 registros da tabela Orders SqlCommand cmdOrder = connection.CreateCommand(); cmdOrder.CommandText ="SELECT TOP 5 OrderID, OrderDate,ShipCity FROM Orders";

connection.Open(); SqlDataReader drOrder = cmdOrder.ExecuteReader(); // Percorre o reader com os registros dos pedidos while (drOrder.Read()) { lstDados.Items.Add("Pedido ID : " + drOrder["OrderID"] + " Cidade : " + drOrder["ShipCity"]);

} connection.Close();

// Cria um DataReader com os detalhes do pedido SqlCommand cmdDetail = connection.CreateCommand(); cmdDetail.CommandText = "SELECT ProductID, Quantity FROM [Order Details] WHERE OrderID=" + dr // percorre os detalhes do pedido para o pedido using (SqlDataReader drDetail = cmdDetail.ExecuteReader()) { while (drDetail.Read()) { lstDados.Items.Add("\tProduto ID : " + drDetail["ProductID"] + "\tQuantidade : " + drDetail["Quantit } lstDados.Items.Add("-------------------------------------------------------------------"); drDetail.Dispose(); }

No cdigo acima temos o seguinte: 1. 2. 3. 4. 5. 6. 7. 8. 9. Definimos a string de conexo Criamos o comando cmdOrder Abrimos a conexo Criamos o DataReader drOrder sobre o comando cmdOrder Percorremos o DataReader drOrder Exibimos o no. do pedido e a cidade Criamos o comando cmdDetail Definimos um novo DataReader drDetail no comando cmdDetail Percorremos o DataReader drDetail e exibimos os detalhes do pedido

Executando o projeto iremos obter o seguinte resultado:

O exemplo mostra que ativando o recurso MARS podemos usar mais de um comando em uma nica conexo. Pegue o projeto completo aqui: MultiplosComandos_PorConexao.zip

Mat 3:11 Eu (Joo Batista), na verdade, vos batizo em gua, na base do arrependimento; mas aquele (Jesus) que vem aps mim mais poderoso do que eu, que nem sou digno de levar-lhe as alparcas; ele vos batizar no Esprito Santo, e em fogo. Mat 3:12 A sua p ele tem na mo, e limpar bem a sua eira; recolher o seu trigo ao celeiro, mas queimar a palha em fogo inextinguvel.

Você também pode gostar