2013-09-11 4 views
0

Я пытаюсь выбрать список пользователей из базы данных и отправлять электронную почту каждому из пользователей на основе условия isSent == false. После отправки им электронной почты значение этого значения false должно быть обновлено до значения true. Ниже приведен код, из которого я получаю список пользователей из базы данных и метод вызова sendEmail() для каждого из них.Концепция обработки SqlCommand в C#

  myConnection.Open(); 
      //******* 
      try 
      { 
       SqlDataReader myReader = null; 
       string sql = "SELECT * FROM testTable where isSent = false"; 
       SqlCommand myCommand = new SqlCommand(sql, myConnection); 
       myReader = myCommand.ExecuteReader(); 

       while (myReader.Read()) 
       { 
        sendEmail(myReader["emailAdd"].ToString(), 
           myReader["UserID"].ToString()); 
       } 

Вторая часть:

public static void sendEmail(string emailAdd,string userID){ 
    . 
    . 
    . 
    try 
    { 
     smtpClient.Send(mail); 
     try 
      { 
       string sql = "UPDATE testTable SET isSent = 1 WHERE UserID = " + userID; 
       SqlCommand myCommand = new SqlCommand(sql, myConnection); 
       int rows = myCommand.ExecuteNonQuery(); 
       . 
       . 
       . 
      } 
    } 
} 

Проблема я столкнулся в том, что, так как от основного метода я уже SqlDataReader будучи держать читать, и поэтому я не могу выполнить обновление сейчас. Любая работа для меня? Сообщение об ошибке, что я получаю, как показано ниже:

There is already an open DataReader associated with this Command which must be closed first. 

ответ

3

Проблема я столкнулся в том, что, так как от основного метода я уже SqlDataReader будучи держать читать, и поэтому я не могу выполнить обновление сейчас. Любая работа для меня?

Это только проблема, потому что вы используете соединение (myConnection). Не делай этого. Создайте новый SqlConnection каждый раз, когда вы хотите выполнить операцию с базой данных, и позвольте инфраструктуре пула соединений сделать ее эффективной. Кроме того, использование using отчетность за ресурсы базы данных, связанные с:

using (var connection = new SqlConnection(...)) 
{ 
    using (var command = new SqlCommand(...)) 
    { 
     using (var reader = command.ExecuteReader(...)) 
     { 
      ... 
     } 
    } 
} 
+0

Я извиняюсь, если я не правильно понимаю, как это до сих пор жалуются на то же error..I я использую фрагмент кода в моей основной метод и другой набор его в методе sendMail(), он должен работать правильно? –

+0

@ IsaacLem: Вы не сказали нам, о какой ошибке вы говорите, что очень сложно сказать, что случилось. Но да, если вы создаете отдельное соединение в каждом фрагменте кода, с этой точки зрения должно быть хорошо. Может возникнуть проблема с точки зрения транзакционных транзакций (чтение из запроса при обновлении данных, с которыми оно работает), но это другое дело. –

+0

Я редактировал свой вопрос, который содержит сообщение об ошибке. Оба способа дают мне то же сообщение об ошибке. Представьте, что первый запрос возвращает мне 3 строки A, B и C. Теперь я пытаюсь обновить один из столбцов строки A. Будут ли какие-либо проблемы с ним? –

0

В качестве другой альтернативы. Вы можете добавить это в свою строку подключения для базы данных.

MultipleActiveResultSets = True

Существует небольшое снижение производительности. И он не поддерживается в старых SQL-серверах. Я думаю, что до 2005

+0

Я использую sqlConnection, что-то вроде ниже: static SqlConnection myConnection = new SqlConnection ("user id = xxx;" + "password = xxx; server = xxx;" + "Trusted_Connection = yes;" + "database = xxx; "+ " время ожидания соединения = 30 "); Вы не можете это сделать? –

+0

В зависимости от версии SQL Server все, что вам нужно сделать, это добавить MultipleActiveResultSets = true в строку, то есть новую SqlConnection ("user id = xxx;" + "password = xxx; server = xxx;" + "Trusted_Connection = yes; База данных "+" = xxx; "+" время ожидания соединения = 30; multipleactiveresultsets = true "); – Valeklosse

+0

Я использую SSMS 2008, это дает мне исключение sqlinitialize –

0

Попробуйте code..`

public static void sendEmail(string emailAdd,string userID){ 
    try 
    { 
     SqlConnection con = new SqlConnection(@""); 
     con.Open(); 

     MailMessage mail = new MailMessage("[email protected]", emailAdd); 
     SmtpClient smtpClient = new SmtpClient(); 
     NetworkCredential nc = new NetworkCredential("[email protected]", "test"); 

     smtpClient.Port = 587; 
     smtpClient.Host = "smtp.gmail.com"; 
     smtpClient.EnableSsl = true; 
     smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; 
     smtpClient.UseDefaultCredentials = false; 
     // smtpClient.Host = "smtp.google.com"; 
     mail.Subject = "this is a test email."; 
     mail.Body = "this is my test email body"; 
     smtpClient.Credentials = nc; 
     smtpClient.Send(mail); 

     using (SqlCommand cmd = con.CreateCommand()) 
     { 
      string sql = "UPDATE TestTable SET IsSent = 'true' WHERE UserID = " + userID; 
      SqlCommand myCommand = new SqlCommand(sql, con); 
      int rows = myCommand.ExecuteNonQuery(); 
     } 
    } 
    catch(Exception e) 
    { 
     string message = e.Message; 
    }` 
} 
Смежные вопросы