Usuário com melhor resposta
Duvida Update Console Aplication C#

Pergunta
-
Caros boa noite!
Solicito a ajuda de vocÊs nesse caso, pois está ocorrendo o seguinte.
Consigo fazer o select e eo envio do e-mail tranquilamente porem estou tentando dar um update na tabela setando o bit enviado = 1 e a data de envio para hoje.
Porem na hora do update ele sempre me retorna o seguinte erro
The connection was not closed. The connection's current state is open.
Não sei o que posso estar errando, deixo abaixo o codigo para ajuda.
Obrigado
try { string strconexao = @"Data Source=BUDDYWEB-PC\SQLEXPRESS;Database=mailing;Integrated Security=true"; SqlConnection conn = new SqlConnection(strconexao); MailMessage mail = new MailMessage(); SmtpClient smtp = new SmtpClient("mail.seudominio.com.br", 25); mail.IsBodyHtml = true; smtp.Credentials = new NetworkCredential("no-reply@buddyweb.com.br", ""); mail.From = new System.Net.Mail.MailAddress("no-reply@buddyweb.com.br"); mail.Subject = "Prefeito Bina - Bina 55 - Um Novo Jeito de Governar"; string htmlBody; StringBuilder mailBody = new StringBuilder(); mailBody.AppendFormat("<html>"); mailBody.AppendFormat("<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' /> "); mailBody.AppendFormat("<meta name='description' content='Prefeito João Delbin - Bina 55 - Um Novo Jeito de Governar' /> "); mailBody.AppendFormat("<title>Prefeito Bina - Bina 55 - Um Novo Jeito de Governar</title> "); mailBody.AppendFormat("<link rel='stylesheet' type='text/css' href='http://buddyweb.com.br/script_mailing/css.css'> "); mailBody.AppendFormat(" <body> "); mailBody.AppendFormat(" <center> "); mailBody.AppendFormat(" <div class='Jimgle' id='sound'><a href='https://www.opendrive.com/listen/OF8yNDYwNzYxX0VpRjB2'><img src='http://buddyweb.com.br/script_mailing/submenuG_jingle.png'></a></div> "); mailBody.AppendFormat(" <img src='http://buddyweb.com.br/script_mailing/02.jpg' border='0' alt='Prefeito Joo Delbin - Bina 55 - Um Novo Jeito de Governar' title='Prefeito João Delbin - Bina 55 - Um Novo Jeito de Governar' /> "); mailBody.AppendFormat(" </center> "); mailBody.AppendFormat(" </body> "); mailBody.AppendFormat("</html> "); htmlBody = mailBody.ToString(); mail.Body = htmlBody; int envio = 0; conn.Open(); SqlCommand cmd = new SqlCommand("SELECT * FROM emailteste WHERE Enviado = 0", conn); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { MailAddressCollection adress = new MailAddressCollection(); adress.Add(dr["Email"].ToString()); mail.To.Add(adress.ToString()); try { if (envio <= 5) { smtp.Send(mail); Console.WriteLine("E-mail enviado com sucesso:" + dr["Email"].ToString()); envio += 1; } else { Thread.Sleep(120000); envio = 0; } conn.Open(); SqlCommand cmds = new SqlCommand("UPDATE [mailing].[dbo].emailteste SET Enviado = 1,DataEnvio='" + DateTime.Now + "' WHERE ID=" + dr["ID"] + "", conn); cmds.ExecuteNonQuery(); conn.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } Console.Read(); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine("---------------------"); Console.WriteLine(ex.Source); Console.WriteLine("---------------------"); Console.WriteLine(ex.StackTrace); Console.Read(); } #endregion }
Obrigado e aguardo um retorno!
"Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é
Respostas
-
Repetindo o que o Maicon disse,
Você abrindo o conection duas vezes.
Tente fazer da seguinte maneira (não tenho certeza se vai funcionar)
substitua esse trecho de codigo
conn.Open(); SqlCommand cmds = new SqlCommand("UPDATE [mailing].[dbo].emailteste SET Enviado = 1,DataEnvio='" + DateTime.Now + "' WHERE ID=" + dr["ID"] + "", conn); cmds.ExecuteNonQuery(); conn.Close();
por este
SqlConnection conn2 = new SqlConnection(strconexao); conn2.open(); SqlCommand cmds = new SqlCommand("UPDATE [mailing].[dbo].emailteste SET Enviado = 1,DataEnvio='" + DateTime.Now + "' WHERE ID=" + dr["ID"] + "", conn2); cmds.ExecuteNonQuery(); conn2.Close();
Bruno Viegas D. Ribeiro
Nunca abandone sua thread!
- Se alguma resposta resolveu seu problema marque-a como resposta para que possa ajudar outras pessoas.
- Se a resposta não resolveu, mas ajudou a você chegar a sua resposta Marque-a como útil.- Marcado como Resposta Atila Rampazo quarta-feira, 12 de setembro de 2012 12:55
Todas as Respostas
-
não sei se é isso mas você está dando open na conn duas vezes
conn.Open();<------aqui SqlCommand cmd = new SqlCommand("SELECT * FROM emailteste WHERE Enviado = 0", conn); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { MailAddressCollection adress = new MailAddressCollection(); adress.Add(dr["Email"].ToString()); mail.To.Add(adress.ToString()); try { if (envio <= 5) { smtp.Send(mail); Console.WriteLine("E-mail enviado com sucesso:" + dr["Email"].ToString()); envio += 1; } else { Thread.Sleep(120000); envio = 0; } conn.Open(); <----e aqui
-
-
você consegue debugar e ver em qual linha o erro acontece?
e você tirou qual conn.Open() o primeiro né?
bahh agora que vi... o primeiro você abre e executa o comando, dai você tem que fechar, e depois no segundo você abre denovo e tem que fechar denovo... não dá pra tirar nenhum dos dois só fechar o primeiro
- Editado M a i c o n quarta-feira, 12 de setembro de 2012 11:03
-
Mais eu tentei fazer dessa maneira
conn.Open(); SqlCommand cmd = new SqlCommand("SELECT * FROM emailteste WHERE Enviado = 0", conn); SqlDataReader dr = cmd.ExecuteReader();
conn.Close();
Porem na hora que ele vai entrar no while() ele vem vazio!
"Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é
-
-
-
mais então ele retorna, pois ele faz todo fluxo normalmente, envia os e-mail o pau ta sendo na hora de da o update, que ele joga o erro
There is already an open DataReader associated with this Command which must be closed first.
conn.Open(); SqlCommand cmd = new SqlCommand("SELECT * FROM emailteste WHERE Enviado = 0", conn); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { MailAddressCollection adress = new MailAddressCollection(); adress.Add(dr["Email"].ToString()); mail.To.Add(adress.ToString()); try { if (envio <= 5) { smtp.Send(mail); Console.WriteLine("E-mail enviado com sucesso:" + dr["Email"].ToString()); envio += 1; } else { Console.WriteLine("##############################################"); Console.WriteLine("## Entrando no Modo Sleep " + DateTime.Now + " ##"); Console.WriteLine("##############################################"); Thread.Sleep(120000); envio = 0; Console.WriteLine("##############################################"); Console.WriteLine("## Saindo no Modo Sleep " + DateTime.Now + "##"); Console.WriteLine("##############################################"); } SqlCommand cmds = new SqlCommand("UPDATE [mailing].[dbo].emailteste SET Enviado = 1,DataEnvio='" + DateTime.Now + "' WHERE ID=" + dr["ID"] + "", conn); cmds.ExecuteNonQuery(); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
"Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é
- Editado Atila Rampazo quarta-feira, 12 de setembro de 2012 11:38
-
não sei se tu já tentou fazer assim, mas se não tentou tenta cara, tbm não sei te dizer certo,
try { string strconexao = @"Data Source=BUDDYWEB-PC\SQLEXPRESS;Database=mailing;Integrated Security=true"; SqlConnection conn = new SqlConnection(strconexao); MailMessage mail = new MailMessage(); SmtpClient smtp = new SmtpClient("mail.seudominio.com.br", 25); mail.IsBodyHtml = true; smtp.Credentials = new NetworkCredential("no-reply@buddyweb.com.br", ""); mail.From = new System.Net.Mail.MailAddress("no-reply@buddyweb.com.br"); mail.Subject = "Prefeito Bina - Bina 55 - Um Novo Jeito de Governar"; string htmlBody; StringBuilder mailBody = new StringBuilder(); mailBody.AppendFormat("<html>"); mailBody.AppendFormat("<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' /> "); mailBody.AppendFormat("<meta name='description' content='Prefeito João Delbin - Bina 55 - Um Novo Jeito de Governar' /> "); mailBody.AppendFormat("<title>Prefeito Bina - Bina 55 - Um Novo Jeito de Governar</title> "); mailBody.AppendFormat("<link rel='stylesheet' type='text/css' href='http://buddyweb.com.br/script_mailing/css.css'> "); mailBody.AppendFormat(" <body> "); mailBody.AppendFormat(" <center> "); mailBody.AppendFormat(" <div class='Jimgle' id='sound'><a href='https://www.opendrive.com/listen/OF8yNDYwNzYxX0VpRjB2'><img src='http://buddyweb.com.br/script_mailing/submenuG_jingle.png'></a></div> "); mailBody.AppendFormat(" <img src='http://buddyweb.com.br/script_mailing/02.jpg' border='0' alt='Prefeito Joo Delbin - Bina 55 - Um Novo Jeito de Governar' title='Prefeito João Delbin - Bina 55 - Um Novo Jeito de Governar' /> "); mailBody.AppendFormat(" </center> "); mailBody.AppendFormat(" </body> "); mailBody.AppendFormat("</html> "); htmlBody = mailBody.ToString(); mail.Body = htmlBody; int envio = 0; conn.Open(); SqlCommand cmd = new SqlCommand("SELECT * FROM emailteste WHERE Enviado = 0", conn); SqlDataReader dr = cmd.ExecuteReader();
conn.Close(); while (dr.Read()) { MailAddressCollection adress = new MailAddressCollection(); adress.Add(dr["Email"].ToString()); mail.To.Add(adress.ToString()); try { if (envio <= 5) { smtp.Send(mail); Console.WriteLine("E-mail enviado com sucesso:" + dr["Email"].ToString()); envio += 1; } else { Thread.Sleep(120000); envio = 0; } conn.Open(); SqlCommand cmds = new SqlCommand("UPDATE [mailing].[dbo].emailteste SET Enviado = 1,DataEnvio='" + DateTime.Now + "' WHERE ID=" + dr["ID"] + "", conn); cmds.ExecuteNonQuery(); conn.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } Console.Read(); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine("---------------------"); Console.WriteLine(ex.Source); Console.WriteLine("---------------------"); Console.WriteLine(ex.StackTrace); Console.Read(); } #endregion }
se não funfa assim, talvez se tu tentasse usar a transaction do teu conn pra comitar, não lembro ao certo mas seria algo como conn.Transaction.Commit(), ao inves de fechar e abrir e fechar a conexão, abre só uma vez e vai commitando mas lembra de por num try catch pra que se caia no catch ele de um conn.Transaction.RollBack()...
-
-
Atila, bom dia
Neste momento,
como esta seu código? qual o erro que esta ocorrendo? e se possível tenta debbugar e mostrar a linha onde o erro acontece.
Bruno Viegas D. Ribeiro
Nunca abandone sua thread!
- Se alguma resposta resolveu seu problema marque-a como resposta para que possa ajudar outras pessoas.
- Se a resposta não resolveu, mas ajudou a você chegar a sua resposta Marque-a como útil. -
Bruno no momento meu codigo está da seguinte maneira
try { string strconexao = @"Data Source=BUDDYWEB-PC\SQLEXPRESS;Database=mailing;Integrated Security=true"; SqlConnection conn = new SqlConnection(strconexao); MailMessage mail = new MailMessage(); SmtpClient smtp = new SmtpClient("mail.seudominio.com.br", 25); mail.IsBodyHtml = true; smtp.Credentials = new NetworkCredential("no-reply@buddyweb.com.br", ""); mail.From = new System.Net.Mail.MailAddress("no-reply@buddyweb.com.br"); mail.Subject = "Prefeito Bina - Bina 55 - Um Novo Jeito de Governar"; string htmlBody; StringBuilder mailBody = new StringBuilder(); mailBody.AppendFormat("<html>"); mailBody.AppendFormat("<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' /> "); mailBody.AppendFormat("<meta name='description' content='Prefeito João Delbin - Bina 55 - Um Novo Jeito de Governar' /> "); mailBody.AppendFormat("<title>Prefeito Bina - Bina 55 - Um Novo Jeito de Governar</title> "); mailBody.AppendFormat("<link rel='stylesheet' type='text/css' href='http://buddyweb.com.br/script_mailing/css.css'> "); mailBody.AppendFormat(" <body> "); mailBody.AppendFormat(" <center> "); mailBody.AppendFormat(" <div class='Jimgle' id='sound'><a href='https://www.opendrive.com/listen/OF8yNDYwNzYxX0VpRjB2'><img src='http://buddyweb.com.br/script_mailing/submenuG_jingle.png'></a></div> "); mailBody.AppendFormat(" <img src='http://buddyweb.com.br/script_mailing/02.jpg' border='0' alt='Prefeito Joo Delbin - Bina 55 - Um Novo Jeito de Governar' title='Prefeito João Delbin - Bina 55 - Um Novo Jeito de Governar' /> "); mailBody.AppendFormat(" </center> "); mailBody.AppendFormat(" </body> "); mailBody.AppendFormat("</html> "); htmlBody = mailBody.ToString(); mail.Body = htmlBody; int envio = 0; conn.Open(); SqlCommand cmd = new SqlCommand("SELECT * FROM emailteste WHERE Enviado = 0", conn); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { MailAddressCollection adress = new MailAddressCollection(); adress.Add(dr["Email"].ToString()); mail.To.Add(adress.ToString()); try { if (envio <= 5) { smtp.Send(mail); Console.WriteLine("E-mail enviado com sucesso:" + dr["Email"].ToString()); envio += 1; } else { Thread.Sleep(120000); envio = 0; } conn.Open(); SqlCommand cmds = new SqlCommand("UPDATE [mailing].[dbo].emailteste SET Enviado = 1,DataEnvio='" + DateTime.Now + "' WHERE ID=" + dr["ID"] + "", conn); cmds.ExecuteNonQuery(); conn.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } Console.Read(); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine("---------------------"); Console.WriteLine(ex.Source); Console.WriteLine("---------------------"); Console.WriteLine(ex.StackTrace); Console.Read(); } #endregion }
O erro ocorre quando eu tento dar um update setando o e-mail como enviado, e a mensagem de erro gerada é essa.
There is already an open DataReader associated with this Command which must be closed first.
"Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é
-
Repetindo o que o Maicon disse,
Você abrindo o conection duas vezes.
Tente fazer da seguinte maneira (não tenho certeza se vai funcionar)
substitua esse trecho de codigo
conn.Open(); SqlCommand cmds = new SqlCommand("UPDATE [mailing].[dbo].emailteste SET Enviado = 1,DataEnvio='" + DateTime.Now + "' WHERE ID=" + dr["ID"] + "", conn); cmds.ExecuteNonQuery(); conn.Close();
por este
SqlConnection conn2 = new SqlConnection(strconexao); conn2.open(); SqlCommand cmds = new SqlCommand("UPDATE [mailing].[dbo].emailteste SET Enviado = 1,DataEnvio='" + DateTime.Now + "' WHERE ID=" + dr["ID"] + "", conn2); cmds.ExecuteNonQuery(); conn2.Close();
Bruno Viegas D. Ribeiro
Nunca abandone sua thread!
- Se alguma resposta resolveu seu problema marque-a como resposta para que possa ajudar outras pessoas.
- Se a resposta não resolveu, mas ajudou a você chegar a sua resposta Marque-a como útil.- Marcado como Resposta Atila Rampazo quarta-feira, 12 de setembro de 2012 12:55