SqlDataSource oninsert过早触发
本文关键字:oninsert SqlDataSource | 更新日期: 2023-09-27 18:04:06
我有一个具有oninserts处理程序的SqlDataSource。处理程序发送一封电子邮件,其中包含从插入记录收集的数据。包括它的ID(一个输出参数)。
昨天,处理程序发送了一封时间戳为下午4:00的电子邮件。在SQL中提交的记录的时间戳之前20分钟。如果你认为这是web/sql/exchange服务器之间的机器时间差异…我已经排除了这种可能性。插入操作由存储过程执行。它在几个表中插入记录。时间戳都是4:20pm。
此外,电子邮件中包含一个不准确的ID。与发送邮件时未提交的记录一致。
问题是,SqlDataSource的oninserts处理程序发送的电子邮件如何可能在SQL中提交记录之前发送?
protected void On_Inserted(object sender, SqlDataSourceStatusEventArgs e)
{
try
{
//GET THE RECORD ID
String RecordID = String.Empty;
RecordID = e.Command.Parameters["@RecordID"].Value != null ? e.Command.Parameters["@RecordID"].Value.ToString() : String.Empty;
//SEND THE EMAIL
SmtpClient smtp = new SmtpClient("SmtpHere",##);
MailMessage email = new MailMessage();
email.From = new MailAddress("FromAddressHere");
email.To.Add("ToAddressHere")
email.Subject = "Example Email";
email.Body = "The record #" + RecordID + " was just added.";
smtp.Send(email);
smtp = null;
email.Dispose();
//GO TO THE PAGE WITH THE NEW RECORD ID
HttpContext.Current.Response.Redirect("~/Page.aspx?RecordID=" + RecordID, false);
}
catch (Exception ex)
{
//HANDLE EXCEPTION
}
}
我猜您的电子邮件代码(在SqlDataSource.Inserted
事件中)不检查SqlDataSourceStatusEventArgs.AffectedRows
属性以确保实际插入一行:
protected void SqlDataSource1_OnInserted(Object source, SqlDataSourceStatusEventArgs e)
{
if (e.AffectedRows > 0)
{
// Send e-mail
}
else
{
// For some reason, the insert didn't happen. Check for exceptions
string errorMessage = e.Exception.InnerException.Message;
// Here you want to display this error to the user, or log it, or something
}
}
所以我认为发生的事情是:
- 电子邮件发出,即使记录还没有真正插入
- 20分钟后,另一个插入操作实际成功。生成另一封电子邮件,插入行,等等。
这种类型的错误可能在一段时间内没有被注意到,这并不奇怪,因为您的插入可能很少失败。