一、引言
使用LINQ TO SQL生成数据库访问层极大地简化了此前数据库访问层的设计(以前基于SQL SERVER的开发大多是基于SQLHELPER或微软企业级的DAAB吧?)。
但是,LINQ TO SQL不是***的。例如,你在重新修改或设计数据库表格后,原先使用LINQ TO SQL生成的DATACONTEXT类并不会自动更新。因此,针对这些更改之后的操作,需要特别注意。
二、问题描述
[一]
本文中首先记录的是使用LINQ插入数据库记录时涉及的一个基本概念级问题。
请看下面的代码片断:
public bool InsertUserStatus(string UserName)
{
eMailDataContext dt = new eMailDataContext();
try
{
//删除可能存在的原有用户状态信息
Table3 u = dt.Table3.First(m => m.abc == UserName);
//if (dt.Table3.Count() != 0)
//{
// Table3 u = dt.Table3.First(m => m.abc == UserName);
//if (u != null)
//{
dt.Table3.DeleteOnSubmit(u);
dt.SubmitChanges();
//}
//}
//创建新的用户状态信息
Table3 userstatus = new Table3
{
abc = UserName
};
//插入到数据库表格UserStatus中
dt.Table3.InsertOnSubmit(userstatus);dt.SubmitChanges();
return true;
}
catch (System.InvalidOperationException)
{
return false;//(2)
}
}
上述代码的意思是,在表格Table3 中先删除可能存在的符合条件的记录,然后在此表格中再插入一条记录数据。上面的代码将“可能”引发异常,将流程控制转向(2)处。
这些“可能”在于,数据表格Table3 中最初无记录,则必引发异常;如果有记录,则一切符合既定操作要求。
于是,修改上面的代码为如下:
public bool InsertUserStatus(string UserName)
{
eMailDataContext dt = new eMailDataContext();
try
{
//删除可能存在的原有用户状态信息
if (dt.Table3.Count() != 0)// (1)
{
Table3 u = dt.Table3.First(m => m.abc == UserName);
if (u != null)
{
dt.Table3.DeleteOnSubmit(u);
dt.SubmitChanges();
}
}
//创建新的用户状态信息
Table3 userstatus = new Table3
{
abc = UserName
};
//插入到数据库表格UserStatus中
dt.Table3.InsertOnSubmit(userstatus);
dt.SubmitChanges();return true;
}
catch (System.InvalidOperationException)
{
return false;
}
}
也就是说,删除操作前需要先判定数据表格是否记空--这可以通过红色的if语句((1)处)来实现。
如此以来,无论表格中是否事先存在记录都可以往下执行可能的删除及插入操作了。
[二]
再来看一个例子,例如:
//删除旧的邮件 where UserName=" + "'"+UserName +"'"+ " and Host=" + "'"+host+"'"; |
上述操作同样抛出异常。因此,需要同上面提到的那样,先进行数据库表格记录数据判断,再进行可能的删除操作。因此,再修改上面代码,如下所示:
//删除旧的邮件 where UserName=" + "'"+UserName +"'"+ " and Host=" + "'"+host+"'"; |
这样便OK了。
【编辑推荐】