none
Duvida Update Console Aplication C# RRS feed

  • 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 é

    terça-feira, 11 de setembro de 2012 20:57

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
    quarta-feira, 12 de setembro de 2012 12:46

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

    terça-feira, 11 de setembro de 2012 21:28
  • amigo agora esta me gerando o seguinte erro.

    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 é

    terça-feira, 11 de setembro de 2012 22:11
  • 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
    quarta-feira, 12 de setembro de 2012 10:55
  • 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 é

    quarta-feira, 12 de setembro de 2012 11:15
  • E que não estou acostumado a trampar dessa maneira então estou meio que perdidao!

    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quarta-feira, 12 de setembro de 2012 11:18
  • o DataReader vem vazio? se for isso o problema é no teu select então que não retorna nada do banco...
    quarta-feira, 12 de setembro de 2012 11:35
  • 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
    quarta-feira, 12 de setembro de 2012 11:37
  • 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()...

    quarta-feira, 12 de setembro de 2012 12:08
  • Ja havia tentado dessa maneira, o transaction nunca ouvi falar, vou procurar aqui !

    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quarta-feira, 12 de setembro de 2012 12:13
  • 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.

    quarta-feira, 12 de setembro de 2012 12:28
  • 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 é

    quarta-feira, 12 de setembro de 2012 12:31
  • 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
    quarta-feira, 12 de setembro de 2012 12:46