2013-03-14 16 views
3

我有一個具有OnInserted處理程序的SqlDataSource。處理程序發送一封電子郵件,其中包含從插入記錄中收集的數據。包括它的ID(輸出參數)。SqlDataSource OnInserted提前觸發

昨天,我有一封電子郵件,發件人的時間戳爲4:00 pm。在SQL中提交記錄的時間戳之前20分鐘。如果你認爲這是web/sql/exchange服務器之間的機器時間差異......我已經排除了這一點。 Insert由存儲過程執行。它在幾張表格中記錄了記錄。所有這些都有下午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 
    } 
} 
+1

您需要提供事件代碼。 – NotMe 2013-03-14 13:58:52

+1

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 – 2013-03-14 14:44:20

回答

2

我猜你的電子郵件的代碼(在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分鐘後,另一插入操作發生,實際上是成功的。生成另一封電子郵件,插入行等。

這種類型的錯誤可能會在一段時間內不被注意,因爲插入可能會失敗很少。

+0

因此,如果OnInserted不等待Insert語句被提交,那麼觸發OnInserted的觸發器是什麼?我的理解是在Insert語句完成後OnInserted觸發。從msdn:「在SqlDataSource控件完成插入操作後引發Inserted事件。」 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.sqldatasourceview.oninserted(v=vs.80).aspx – s15199d 2013-03-14 14:53:47

+0

@ s15199d好的,這是令人困惑的部分。從SqlDataSource的角度來看,插入操作*已經*完成了(從它構造一個SQL語句的意義上說,它將它發送到數據庫並得到某種響應)。它不會在數據庫*上執行成功的插入操作之後說「*」。這就是爲什麼他們會向您發送'Exception'和'ExceptionHandled'屬性 - 由開發人員決定如何處理。 – jadarnel27 2013-03-14 14:58:14

+0

謝謝@jadarnel!你的迴應是現貨。 – s15199d 2013-03-14 15:37:31