2012-10-09 108 views
1

我想從表中獲取記錄列表,然後在foreach循環我試圖update的記錄逐一。LINQ到SQL記錄不更新

這裏是我的代碼

 public IEnumerable<MessageOut> GetSMSInformation() 
     { 
      using (var db = new DataClasses1DataContext()) 
      { 
       var sms = db.MessageOuts.Where(msg => msg.msgstatus.Equals("Pending")).Select(msg => msg); 
       return sms.ToList(); 
      } 
     } 



    public void StartSMSSending() 
     { 
      var information = GetSMSInformation(); 

      foreach (var sms in information) 
      { 
       SendSMS(sms.reciever, sms.msg); 
       UpdateRecords(sms,"Delivered", DateTime.Now); 
      } 
     } 

    public void UpdateRecords(MessageOut sms, string msgStatus, DateTime sentTime) 
     { 
      using (var db = new DataClasses1DataContext()) 
      { 
       sms.msgstatus = msgStatus; 
       sms.senttime = sentTime; 
       db.SubmitChanges(); 
      } 
     } 

只是不update.I我沒有得到任何錯誤和記錄。

有人可以幫我解決這個問題嗎?

回答

7

爲了執行你需要保持你的背景下活着LINQ2SQL類的更新操作。在上面的示例中,將選擇內容包含在using語句中,以便返回記錄,然後轉儲上下文。當您進行更新時,會有一個新的上下文,因此沒有更改註冊到對象。做到這一點的一種方法可能是使上下文成爲更全局的對象或將其作爲參數傳遞。

public IEnumerable<MessageOut> GetSMSInformation(DataContext context) 
{ 
    var sms = context.MessageOuts.Where(
     msg => msg.msgstatus.Equals("Pending")).Select(msg => msg); 
    return sms.ToList(); 
} 

public void StartSMSSending() 
{ 
    using (var db = new DataClasses1DataContext()) 
    { 
     var information = GetSMSInformation(db); 

     foreach (var sms in information) 
     { 
      SendSMS(sms.reciever, sms.msg); 
      UpdateRecords(sms,"Delivered", DateTime.Now, db); 
     } 
    } 
} 

public void UpdateRecords(MessageOut sms, string msgStatus, DateTime sentTime, DataContext context) 
{ 
    sms.msgstatus = msgStatus; 
    sms.senttime = sentTime; 
    context.SubmitChanges(); 
} 

或者,你可以這樣做(我的首選方法):

public IEnumerable<MessageOut> GetSMSInformation() 
{ 
    var sms = Context.MessageOuts.Where(
     msg => msg.msgstatus.Equals("Pending")).Select(msg => msg); 
    return sms.ToList(); 
} 

public void StartSMSSending() 
{ 
    var information = GetSMSInformation(db); 

    foreach (var sms in information) 
    { 
     SendSMS(sms.reciever, sms.msg); 
     UpdateRecords(sms,"Delivered", DateTime.Now, db); 
    } 
} 

public void UpdateRecords(MessageOut sms, string msgStatus, DateTime sentTime) 
{ 
    sms.msgstatus = msgStatus; 
    sms.senttime = sentTime; 
    Context.SubmitChanges(); 
} 

private DataClasses1DataContext _context = null; 
public DataClasses1DataContextContext 
{ 
    get 
    { 
     return _context ?? (_context = new DataClasses1DataContext()); 
    } 
} 
+0

非常感謝,理解我的錯誤,+1幫助。 – freebird

3

你從這個DB上下文中提取數據:

public IEnumerable<MessageOut> GetSMSInformation() 
    { 
     using (var db = new DataClasses1DataContext()) 
     { 
      var sms = db.MessageOuts.Where(msg => msg.msgstatus.Equals("Pending")).Select(msg => msg); 
      return sms.ToList(); 
     } 
    } 

然後要更新從先前的DB上下文數據是您要提交變化到不同的DB背景:

public void UpdateRecords(MessageOut sms, string msgStatus, DateTime sentTime) 
    { 
     using (var db = new DataClasses1DataContext()) 
     { 
      sms.msgstatus = msgStatus; 
      sms.senttime = sentTime; 
      db.SubmitChanges(); 
     } 
    } 

通行證數據庫上下文作爲參考或最好的保持爲您的類的成員。這確保了您的類實例的單個數據庫上下文實例。

我的建議是以下幾點:

class SmsCenter 
{ 
     private DataClasses1DataContext _dbContext; 

     public SmsCenter() 
     { 
      _dbContext = new DataClasses1DataContext(); 
     } 

     public IEnumerable<MessageOut> GetSMSInformation() 
     { 
      var sms = _dbContext.MessageOuts.Where(msg => msg.msgstatus.Equals("Pending")).Select(msg => msg); 
      return sms.ToList(); 
     } 



     public void StartSMSSending() 
     { 
      var information = GetSMSInformation(); 

      foreach (var sms in information) 
      { 
       SendSMS(sms.reciever, sms.msg); 
       UpdateRecords(sms,"Delivered", DateTime.Now); 
      } 
     } 

     public void UpdateRecords(MessageOut sms, string msgStatus, DateTime sentTime) 
     { 
      sms.msgstatus = msgStatus; 
      sms.senttime = sentTime; 
      _dbContext.SubmitChanges(); 
     } 
} 
+0

感謝您的幫助。明白是什麼錯誤。+ 1的幫助。 – freebird

1

你din't涉及 「SMS」 的對象與數據庫,像

  sms.msgstatus = msgStatus; 
      sms.senttime = sentTime; 
      db.MessageOut.Add(sms); 
      //or 
      db.MessageOut=sms; 
      db.SubmitChanges();