淺談LINQ如何插入刪除和更新數(shù)據(jù)庫記錄備注
一、引言
使用LINQ TO SQL生成數(shù)據(jù)庫訪問層極大地簡化了此前數(shù)據(jù)庫訪問層的設(shè)計(以前基于SQL SERVER的開發(fā)大多是基于SQLHELPER或微軟企業(yè)級的DAAB吧?)。
但是,LINQ TO SQL不是***的。例如,你在重新修改或設(shè)計數(shù)據(jù)庫表格后,原先使用LINQ TO SQL生成的DATACONTEXT類并不會自動更新。因此,針對這些更改之后的操作,需要特別注意。
二、問題描述
[一]
本文中首先記錄的是使用LINQ插入數(shù)據(jù)庫記錄時涉及的一個基本概念級問題。
請看下面的代碼片斷:
public bool InsertUserStatus(string UserName)
{
eMailDataContext dt = new eMailDataContext();
try
{
//刪除可能存在的原有用戶狀態(tài)信息
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();
//}
//}
//創(chuàng)建新的用戶狀態(tài)信息
Table3 userstatus = new Table3
{
abc = UserName
};
//插入到數(shù)據(jù)庫表格UserStatus中
dt.Table3.InsertOnSubmit(userstatus);dt.SubmitChanges();
return true;
}
catch (System.InvalidOperationException)
{
return false;//(2)
}
}
上述代碼的意思是,在表格Table3 中先刪除可能存在的符合條件的記錄,然后在此表格中再插入一條記錄數(shù)據(jù)。上面的代碼將“可能”引發(fā)異常,將流程控制轉(zhuǎn)向(2)處。
這些“可能”在于,數(shù)據(jù)表格Table3 中最初無記錄,則必引發(fā)異常;如果有記錄,則一切符合既定操作要求。
于是,修改上面的代碼為如下:
public bool InsertUserStatus(string UserName)
{
eMailDataContext dt = new eMailDataContext();
try
{
//刪除可能存在的原有用戶狀態(tài)信息
if (dt.Table3.Count() != 0)// (1)
{
Table3 u = dt.Table3.First(m => m.abc == UserName);
if (u != null)
{
dt.Table3.DeleteOnSubmit(u);
dt.SubmitChanges();
}
}
//創(chuàng)建新的用戶狀態(tài)信息
Table3 userstatus = new Table3
{
abc = UserName
};
//插入到數(shù)據(jù)庫表格UserStatus中
dt.Table3.InsertOnSubmit(userstatus);
dt.SubmitChanges();return true;
}
catch (System.InvalidOperationException)
{
return false;
}
}
也就是說,刪除操作前需要先判定數(shù)據(jù)表格是否記空--這可以通過紅色的if語句((1)處)來實現(xiàn)。
如此以來,無論表格中是否事先存在記錄都可以往下執(zhí)行可能的刪除及插入操作了。
[二]
再來看一個例子,例如:
//刪除舊的郵件 where UserName=" + "'"+UserName +"'"+ " and Host=" + "'"+host+"'"; |
上述操作同樣拋出異常。因此,需要同上面提到的那樣,先進行數(shù)據(jù)庫表格記錄數(shù)據(jù)判斷,再進行可能的刪除操作。因此,再修改上面代碼,如下所示:
//刪除舊的郵件 where UserName=" + "'"+UserName +"'"+ " and Host=" + "'"+host+"'"; |
這樣便OK了。
【編輯推薦】