我正在尝试从表中获取记录列表,然后在foreach
循环中逐一尝试update
记录。
这是我的代码
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();
}
}
记录不会更新。我也没有收到任何错误。
有人可以帮我解决这个问题吗?
答案 0 :(得分: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());
}
}
答案 1 :(得分: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上下文,则要更新先前数据库上下文中的数据:
public void UpdateRecords(MessageOut sms, string msgStatus, DateTime sentTime)
{
using (var db = new DataClasses1DataContext())
{
sms.msgstatus = msgStatus;
sms.senttime = sentTime;
db.SubmitChanges();
}
}
将数据库上下文作为参考或最佳保持为您的班级成员。这确保了类实例的单个db上下文实例。
我的建议如下:
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();
}
}
答案 2 :(得分:1)
你没有关联&#34; sms&#34; db的对象,如
sms.msgstatus = msgStatus;
sms.senttime = sentTime;
db.MessageOut.Add(sms);
//or
db.MessageOut=sms;
db.SubmitChanges();