徐照興
(江西服裝學(xué)院 服裝商貿(mào)分院, 江西 南昌 330201)
NET平臺(tái)下LINQ TO SQL關(guān)鍵技術(shù)的實(shí)踐研究
徐照興
(江西服裝學(xué)院 服裝商貿(mào)分院, 江西 南昌 330201)
LINQ to SQL在對(duì)象領(lǐng)域和數(shù)據(jù)領(lǐng)域之間架起了一座橋梁,利用LINQ to SQL可以簡(jiǎn)化對(duì)SQL Server數(shù)據(jù)庫(kù)的操作。本文介紹了LINQ to SQL技術(shù)要點(diǎn),闡述了創(chuàng)建LINQ to SQL實(shí)體類的映射的步驟方法及注意事項(xiàng),給出了LINQ to SQL訪問(wèn)SQL Server數(shù)據(jù)庫(kù)的查詢、刪除、修改、更新操作要點(diǎn)及實(shí)現(xiàn)的核心代碼。
LINQ to SQL;.NET;SQL Server;數(shù)據(jù)訪問(wèn)
LINQ(Language Integrated Query——語(yǔ)言集成查詢)是.NET Framework3.5中的創(chuàng)新性數(shù)據(jù)訪問(wèn)技術(shù),使程序員不必精通數(shù)據(jù)庫(kù)就能快速開發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序。傳統(tǒng)的ADO.NET數(shù)據(jù)庫(kù)訪問(wèn)技術(shù),需要針對(duì)不同的數(shù)據(jù)庫(kù)編寫不同的SQL語(yǔ)句,要求程序員要熟練各種數(shù)據(jù)庫(kù)及SQL語(yǔ)法等,如果SQL語(yǔ)句寫錯(cuò)了,只有到運(yùn)行時(shí)才能發(fā)現(xiàn)。LINQ是建立在ADO.NET技術(shù)基礎(chǔ)上的,它能夠把LINQ查詢自動(dòng)轉(zhuǎn)換成SQL語(yǔ)句。
LINQ是革命性的編程技術(shù),它改變了程序和數(shù)據(jù)之間的關(guān)系。LINQ to SQL是針對(duì)訪問(wèn)Microsoft SQL Server和Oracle數(shù)據(jù)庫(kù)的LINQ版本,它通過(guò)以對(duì)象形式來(lái)管理關(guān)系數(shù)據(jù)庫(kù)。傳統(tǒng)方法使用SQL數(shù)據(jù)庫(kù)需要掌握必要的SQL知識(shí),在編程語(yǔ)言中嵌套SQL語(yǔ)句,或者把包含SQL語(yǔ)句的字符串傳送給面向SQL的數(shù)據(jù)庫(kù)類庫(kù)中的API調(diào)用或方法。LINO to SOL可以處理與SOL數(shù)據(jù)庫(kù)通信的所有細(xì)節(jié)。當(dāng)應(yīng)用程序運(yùn)行時(shí),LINQ to SQL會(huì)將對(duì)象模型中的語(yǔ)言集成查詢轉(zhuǎn)換為SQL,然后將它們發(fā)送到數(shù)據(jù)庫(kù)進(jìn)行執(zhí)行。當(dāng)數(shù)據(jù)庫(kù)返回結(jié)果時(shí),LINQ to SQL會(huì)將它們轉(zhuǎn)換回編程語(yǔ)言處理的對(duì)象。
使用LINQ to SQL時(shí),需要通過(guò)LINQ to SQL在關(guān)系數(shù)據(jù)庫(kù)和編程語(yǔ)言(可以使C#、VB.NET等,本文實(shí)例選用C#)之間創(chuàng)建對(duì)象相關(guān)映射(Object-Relational Mapping,ORM)。主要的對(duì)應(yīng)關(guān)系有:關(guān)系數(shù)據(jù)模型中的表對(duì)應(yīng)LINQ to SQL對(duì)象模型中的實(shí)體類,關(guān)系數(shù)據(jù)模型中的表的字段對(duì)應(yīng)LINQ to SQL對(duì)象模型中的類成員,關(guān)系數(shù)據(jù)模型中的外鍵關(guān)系對(duì)應(yīng)LINQ to SQL對(duì)象模型中的關(guān)聯(lián),關(guān)系數(shù)據(jù)模型中的存儲(chǔ)過(guò)程或函數(shù)對(duì)應(yīng)LINQ to SQL對(duì)象模型中的方法。
使用LINQ to SQL訪問(wèn)數(shù)據(jù)庫(kù)的第一步是要?jiǎng)?chuàng)建映射到數(shù)據(jù)庫(kù)表和視圖的 LINQ to SQL實(shí)體類,該實(shí)體類的屬性映射到所選表或視圖中的列(字段)。創(chuàng)建的方法有多種,比如手動(dòng)編碼、用XML文件映射等,但是使用Visual Studio平臺(tái)提供的O/R對(duì)象關(guān)系設(shè)計(jì)器最為方便,步驟如下(在此以Visual Studio2012平臺(tái)、SQL Server2008創(chuàng)建DBTeacher數(shù)據(jù)庫(kù)為例):
1.建立一個(gè)web網(wǎng)站,點(diǎn)擊“工具”菜單下的“選項(xiàng)”命令,彈出選項(xiàng)對(duì)話框,在該對(duì)話框左側(cè)點(diǎn)開“數(shù)據(jù)庫(kù)工具”,選擇下面的“O/R Designer”,在右側(cè)把“名稱的復(fù)數(shù)形式”啟用設(shè)置為“True”。
2.創(chuàng)建數(shù)據(jù)庫(kù)(DBTeacher)并建立表(tbTeacherInfo)在Visual Studio2012平臺(tái)右側(cè)的解決方案。資源管理器的解決方案中添加App_Data文件夾,然后在該文件夾下添加SQL Serve數(shù)據(jù)庫(kù)文件DBTeacher。然后通過(guò)左側(cè)的服務(wù)器資源管理器為數(shù)據(jù)庫(kù)DBTeacher建立表tbTeacherInfo,在此只是為了說(shuō)明問(wèn)題,只創(chuàng)建三個(gè)字段,分別是TeacherID(主鍵)、TeacherName及Title,并向該表任意添加幾條記錄(作為測(cè)試用)。
3.右擊站點(diǎn)根目錄,選擇“添加”/“添加新項(xiàng)”,在已安裝模板中再選擇“LINQ to SQL類”,并設(shè)置名稱為DBTeacher.dbml(注意,此處LINQ to SQL類名稱的主文件名最好與數(shù)據(jù)庫(kù)主文件名一致),單擊“確定”之后,提示把DBTeacher.dbml文件放在App_Code文件夾下,單擊“是”即可。
4.在服務(wù)器資源管理器中,將tbTeacherInfo表拖動(dòng)到“對(duì)象關(guān)系設(shè)計(jì)器” DBTeacher.dbml的窗口中,tbTeacherInfo表及其列在設(shè)計(jì)器窗口中由名為tbTeacherInfo的實(shí)體表示。此過(guò)程在web.config文件中會(huì)自動(dòng)生成鏈接數(shù)據(jù)庫(kù)的字符串,名稱為“數(shù)據(jù)庫(kù)主文件名”+“ConnectionString”。更主要是在DBTeacher.designer.cs中會(huì)自動(dòng)生成必要的代碼。
創(chuàng)建映射到數(shù)據(jù)庫(kù)表和視圖的 LINQ to SQL實(shí)體類之后,就可以直接通過(guò)LINQ to SQL技術(shù)訪問(wèn)數(shù)據(jù)庫(kù)了,訪問(wèn)數(shù)據(jù)庫(kù)主要包括查詢、添加、刪除、修改等操作。它們實(shí)現(xiàn)的一般步驟如下:
首先,根據(jù)LINQ to SQL實(shí)體類,創(chuàng)建一個(gè)數(shù)據(jù)上下文對(duì)象(如,TeacherDataContent)。
其次,采用查詢語(yǔ)法,根據(jù)實(shí)際操作執(zhí)行相應(yīng)的LINQ查詢,并將結(jié)果賦予一個(gè)變量(如,Results)。如果知道了操作結(jié)果最多只有一條記錄,采用方法語(yǔ)法時(shí)使用SingleOrDefault ()方法實(shí)現(xiàn)往往更方便快捷。
最后,根據(jù)查詢的結(jié)果,進(jìn)行相應(yīng)的數(shù)據(jù)綁定或給出相應(yīng)的提示。
下面給出查詢、添加、刪除、修改四種操作的核心代碼。
1.查詢操作(以按教師編號(hào)
DBTeacherDataContext teacherDC = new DBTeacherDataContext();
String SelectID = TextBoxID.Text;
var Results=from tbTecaherInfo in teacherDC. tbTecaherInfos where tbTecaherInfo.TeacherID==SelectID select tbTecaherInfo ;
if (Results.Count() == 1)
{ GVshow.DataSource = Results;
GVshow.DataBind();}
2.刪除操作(以按姓名刪除為例)
DBTeacherDataContext tdc = new DBTeacherDataContext();
string delname = TextBoxName.Text;
var Results = from tbTecaherInfo in tdc. tbTecaherInfos where tbTecaherInfo.TeacherName == delname select tbTecaherInfo;
if (Results.Count() > 0)
{ int delNumers = Results.Count();
foreach (var del in Results)
{ tdc.tbTecaherInfos.DeleteOnSubmit(del);
tdc.SubmitChanges();}}
3.添加操作
DBTeacherDataContext tdc = new DBTeacherDataContext();
string Stitle;
tbTecaherInfo teacherinfo =tdc. tbTecaherInfos.SingleOrDefault(t=>t.TeacherID ==TextBoxID.Text);
if (teacherinfo == null)
{ tbTecaherInfo s1 = new tbTecaherInfo { TeacherID = TextBoxID.Text , TeacherName = TextBoxName.Text , Title = Stitle };
tdc. tbTecaherInfos.InsertOnSubmit(s1);
tdc.SubmitChanges(); }
4.修改操作(以根據(jù)教師編號(hào)進(jìn)行修改為例)
string UpdateID = TextBoxID.Text;
DBTeacherDataContext tdc = new DBTeacherDataContext();
tbTecaherInfo teacherinfo =tdc. tbTecaherInfos.SingleOrDefault(t=>t.TeacherID ==TextBoxID.Text);
tbTecaherInfo.TeacherName = TextBoxName.Text;
tbTecaherInfo.Title = TextBoxTitle.Text;
studentDC.SubmitChanges();
LINQ to SQL在對(duì)象領(lǐng)域和數(shù)據(jù)領(lǐng)域之間架起了一座橋梁,使程序員可以不必過(guò)多的關(guān)注SQL語(yǔ)句的編寫,而是把精力集中在業(yè)務(wù)邏輯的實(shí)現(xiàn)上。文章分析了LINQ to SQL的關(guān)鍵技術(shù),給出了訪問(wèn)SQL Server數(shù)據(jù)庫(kù)的查詢、添加、刪除、修改操作的實(shí)現(xiàn)核心代碼,并進(jìn)行了詳盡的解釋,讀者可以從中快速掌握LINQ to SQL技術(shù)。
2095-4654(2015)03-0006-02
2014-11-12
TP393 ;TP311
A