问题
I'm trying to select a list of users from the database and send email to each of every users based on a condition isSent == false. After send email to them, the value of this false should be update to true. Below code is the way i retrieve list of users from database and call method sendEmail() to each of them.
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());
}
Second part:
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();
.
.
.
}
}
}
The problem I'm facing is that since from main method I already have SqlDataReader being hold to read and so I cant update now. Any work around for me? The error message that I get is as below:
There is already an open DataReader associated with this Command which must be closed first.
回答1:
The problem I'm facing is that since from main method I already have SqlDataReader being hold to read and so I cant update now. Any work around for me?
That's only a problem because you're sharing the connection (myConnection
). Don't do that. Create a new SqlConnection
every time you want to perform a database operation, and let the connection pool infrastructure handle making it efficient. Also, use using
statements for database-related resources:
using (var connection = new SqlConnection(...))
{
using (var command = new SqlCommand(...))
{
using (var reader = command.ExecuteReader(...))
{
...
}
}
}
回答2:
As another alternative. You could add this to your connection string for the database.
MultipleActiveResultSets=True
There is a small performance degradation. And its not supported in older SQL Servers. I think pre 2005
回答3:
Try this code..`
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;
}`
}
来源:https://stackoverflow.com/questions/18737360/concept-of-handling-sqlcommand-in-c-sharp