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&