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 alread an open DataReader associated !ith this Command !hich
must "e closed #irst." ("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 $$$
%ode& mas para isso 'oc( tem )ue ati'ar o recurso MAR* - Multiple Acti'e
Result *ets.
O recurso MAR* possibilita abrir mltiplos objetos *)lDataReader em uma
nica conexo. Ele permite que um aplicativo tena mais de um
*)lDataReader aberto em uma conexo quando cada inst!ncia do
*)lDataReader " iniciada a partir de um comando separado. #ada objeto
*)lCommand que voc adicionar acrescenta uma sesso adicional para a
conexo.
O recurso MAR* est dispon$vel em muitos *+,Ds% sendo que o S&' Server
())* +oi o primeiro a dar suporte ao ,-.S. /oc pode controlar
explicitamente a ativa0o do recurso utilizando um par de palavras1cave em
sua seq2ncia de conexo. 3ara ativar o recurso MAR* em sua conexo voc
de+ine explicitamente o atributo MultipleActi'eResult*ets na seq2ncia de
conexo para True da seguinte +orma:
strin- north!indConnection*trin- .
"*er'er.localhost/Data"ase.North!ind/Trusted0Connection.True/Multiple
Acti'eResult*ets.True"/
/ou mostrar um exemplo prtico usando os seguintes recursos:
/isual #4 ()5) Express Edition
S&' Server ())6 Express Edition
7anco de dados 8ort9ind.md+ :attached;
Criando o pro1eto
8este projeto exemplo vamos abrir dois DataReader usando dois comandos na
mesma conexo:
Comando cmdOrder e DataReader drOrder - O"t2m os 3 primeiros
pedidos da ta"ela Orders/
Comando cmdDetail e DataReader drDetail - O"t2m os detalhes do
pedido para cada pedido na ta"ela Order Details/
/amos criar um novo projeto no /isual #4 ()5) Express Edition acionando o
menu 4ile -5 Ne! %ro1ect e a seguir escolendo o template <indo9s =orms
-pplication>
?n+orme o nome MultiplosComandos0%orConexao e clique no boto O@>
- seguir abra a janela Aatabase Explorer e clique no $cone Data Connections
com o boto direito do mouse e selecione Add Connections/
8a janela Add Connection escola o Aata Source 1 Microso#t *67 *er'er
Data"ase 4ile 8*)lClient9 1 e in+orme o local do banco de dados
North!ind.md#>
O"s: Eu estou anexando o "anco de dados North!ind.md# no meu *67
*er'er.
-pBs clicar no boto O@ voc dever ter acesso a todos os objetos do banco
de dados North!ind.md# no S&' Server.
8o +ormulrio padro #orm;.cs inclua os seguintes controles:
7ist,ox - lstDados
,utton - "tnExecutar e "tnEncerrar
Aispona os controles con+orme o leiaute da +igura a seguir:
/amos declarar os seguintes namespaces no inicio do +ormulrio:
using SCstem>
using SCstem.<indo9s.=orms>
using SCstem.Aata.Sql#lient>
/amos de+inir a string de conexo e ativar o recurso MAR* :
strin- s)lConnect*trin- . <"Data
*ource..=*67E>%RE**/AttachD"4ilename.C:=dados=North!ind.MD4/?nte-ra
ted *ecurit.True/Connect Timeout.@A/Bser
?nstance.True/MultipleActi'eResult*ets.True"/
O cBdigo do evento ClicC do boto Executar " mostrado a seguir:
private void btnExecutarD#licE:object sender% Event-rgs e;
F
string sql#onnectString G <"Data *ource..=*67E>%RE**/AttachD"4ilename.C:=dados=North!ind.MD4/?nte-rated *ecurit.True/Connect Timeout.@A/Bser
?nstance.True/MultipleActi'eResult*ets.True"/
Sql#onnection connection G ne9 Sql#onnection:sql#onnectString;>
HH cria o Aata.eader com I registros da tabela Orders
Sql#ommand cmdOrder G connection.#reate#ommand:;>
cmdOrder.#ommandJext G"*E7ECT TO% 3 Order?D& OrderDate&*hipCit 4ROM Orders"/
connection.Open:;>
SqlAata.eader drOrder G cmdOrder.Execute.eader:;>
HH 3ercorre o reader com os registros dos pedidos
9ile :drOrder..ead:;;
F
lstAados.?tems.-dd:K3edido ?A : K L drOrderMKOrder?AKN L K #idade : K L drOrderMKSip#itCKN;>
HH #ria um Aata.eader com os detales do pedido
Sql#ommand cmdAetail G connection.#reate#ommand:;>
cmdAetail.#ommandJext G K*E7ECT %roduct?D& 6uantit 4ROM DOrder DetailsE FGERE Order?D." H drOrderD"Order?D"E
HH percorre os detales do pedido para o pedido
usin- 8*)lDataReader drDetail . cmdDetail.ExecuteReader899
F
9ile :drAetail..ead:;;
F
lstAados.?tems.-dd:KOt3roduto ?A : K L drAetailMK3roduct?AKN L KOt&uantidade : K L drAetailMK&uantitCKN;>
P
lstAados.?tems.-dd:K1111111111111111111111111111111111111111111111111111111111111111111K;>
drAetail.Aispose:;>
P
P
connection.#lose:;>
P
P
8o cBdigo acima temos o seguinte:
5. Ae+inimos a string de conexo
(. #riamos o comando cmdOrder
I. -brimos a conexo
Q. #riamos o Aata.eader drOrder sobre o comando cmdOrder
*. 3ercorremos o Aata.eader drOrder
R. Exibimos o no. do pedido e a cidade
S. #riamos o comando cmdAetail
6. Ae+inimos um novo Aata.eader drAetail no comando cmdAetail
T. 3ercorremos o Aata.eader drAetail e exibimos os detales do pedido
Executando o projeto iremos obter o seguinte resultado:
O exemplo mostra que ativando o recurso MAR* podemos usar mais de um
comando em uma nica conexo.
3egue o projeto completo aqui: MultiplosComandos0%orConexao.Iip
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 levarl!e as alpar"as; ele vos
batizar no Esp#rito $anto, e em %ogo&
Mat 3:1' ( sua p ele tem na m)o, e limpar bem a sua eira; re"ol!er
o seu trigo ao "eleiro, mas queimar a pal!a em %ogo ine*tingu#vel&