0

我正在尝试从数据库中选择一个用户列表,并根据条件 isSent == false 向每个用户发送电子邮件。向他们发送电子邮件后,此 false 的值应更新为 true。下面的代码是我从数据库中检索用户列表并向每个用户调用方法 sendEmail() 的方式。

           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.
4

3 回答 3

4

我面临的问题是,由于从主要方法开始,我已经拥有 SqlDataReader 可以读取,所以我现在无法更新。有什么适合我的工作吗?

这只是一个问题,因为您正在共享连接 ( myConnection)。不要那样做。SqlConnection每次您想要执行数据库操作时都创建一个新的,并让连接池基础结构处理使其高效。此外,using对数据库相关资源使用语句:

using (var connection = new SqlConnection(...))
{
    using (var command = new SqlCommand(...))
    {
        using (var reader = command.ExecuteReader(...))
        {
            ...
        }
    }
}
于 2013-09-11T09:28:39.303 回答
0

试试这个代码..`

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

        MailMessage mail = new MailMessage("example@gmail.com", emailAdd);
        SmtpClient smtpClient = new SmtpClient();
        NetworkCredential nc = new NetworkCredential("example@gmail.com", "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;
    }`
 }
于 2013-09-11T13:16:44.277 回答
0

作为另一种选择。您可以将其添加到数据库的连接字符串中。

MultipleActiveResultSets=真

有一个小的性能下降。旧版 SQL Server 不支持它。我认为 2005 年之前

于 2013-09-11T09:33:21.873 回答