3

我有一个具有 OnInserted 处理程序的 SqlDataSource。处理程序发送一封电子邮件,其中包含从已插入记录中收集的数据。包括它的 ID(一个输出参数)。

昨天,我收到一封由处理程序发送的电子邮件,其时间戳为下午 4:00。在 SQL 中提交记录的时间戳之前 20 分钟。如果您认为这是 web/sql/exchange 服务器之间的机器时间差异......我已经排除了这一点。插入由存储过程执行。它在几个表中插入记录。所有这些都有一个下午 4:20 的时间戳。

此外,该电子邮件包含不准确的 ID。与发送电子邮件时未提交的记录一致。

问题是,SqlDataSource 的 OnInserted 处理程序发送的电子邮件怎么可能在 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
    }
}
4

1 回答 1

3

我猜您的电子邮件代码(在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
    }
}

所以我认为发生的是:

  1. 即使记录还没有真正插入,电子邮件也会触发
  2. 20 分钟后,另一个插入操作发生,实际上是成功的。生成另一封电子邮件,插入行等。

这种类型的错误可能会在一段时间内被忽视,这并不奇怪,因为您的插入可能很少会失败。

于 2013-03-14T13:56:57.257 回答