3

OnInserted ハンドラーを持つ SqlDataSource があります。ハンドラーは、挿入されたレコードから収集されたデータを含む電子メールを送信します。その ID (出力パラメーター) を含めます。

昨日、ハンドラーから午後 4 時のタイムスタンプを持つメールが送信されました。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 に答える