版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
本章要求:第13章LINQ數(shù)據(jù)操作技術(shù)LINQ技術(shù)的組成架構(gòu)常用的LINQ查詢子句及使用如何創(chuàng)建LINQ數(shù)據(jù)源使用LINQ技術(shù)對(duì)數(shù)據(jù)庫(kù)執(zhí)行增、刪、改、查操作如何使用LinqDataSource控件使用LINQ技術(shù)操作數(shù)組和集合使用LINQ技術(shù)操作DataSet數(shù)據(jù)集使用LINQ技術(shù)操作XML文件使用LINQ技術(shù)實(shí)現(xiàn)數(shù)據(jù)分頁(yè)功能使用LINQ技術(shù)防止SQL注入式攻擊主要內(nèi)容1.LINQ技術(shù)概述2.LINQ查詢常用子句3.使用LINQ操作SQLServer數(shù)據(jù)庫(kù)4.使用LINQ操作其他數(shù)據(jù)5.綜合實(shí)例——使用LINQ實(shí)現(xiàn)數(shù)據(jù)分頁(yè)第13章LINQ數(shù)據(jù)操作技術(shù)13.1LINQ技術(shù)概述LINQ是.NETFramework中一項(xiàng)突破性的創(chuàng)新,它在對(duì)象領(lǐng)域和數(shù)據(jù)領(lǐng)域之間架起了一座橋梁。LINQ主要由3部分組成,分別為L(zhǎng)INQtoObjects、LINQtoADO.NET和LINQtoXML。其中,LINQtoADO.NET可以分為兩部分,分別為L(zhǎng)INQtoSQL和LINQtoDataSet。LINQ的組成說(shuō)明如下:LINQtoSQL組件:可以查詢基于關(guān)系數(shù)據(jù)庫(kù)的數(shù)據(jù),并對(duì)這些數(shù)據(jù)進(jìn)行檢索、插入、修改、刪除、排序、聚合和分區(qū)等操作。LINQtoDataSet組件:可以查詢DataSet對(duì)象中的數(shù)據(jù),并對(duì)這些數(shù)據(jù)進(jìn)行檢索、過(guò)濾和排序等操作。LINQtoObjects組件:可以查詢Ienumerable或Ienumerable<T>集合,也就是說(shuō)可以查詢?nèi)魏慰擅杜e的集合,如數(shù)據(jù)(Array和ArrayList)、泛型列表List<T>、泛型字典Dictionary<T>以及用戶自定義的集合,而不需要使用LINQ提供程序或API。LINQtoXML組件:可以查詢或操作XML結(jié)構(gòu)的數(shù)據(jù)(如XML文檔、XML片段和XML格式的字符串等),并提供了修改文檔對(duì)象模型的內(nèi)存文檔和支持LINQ查詢表達(dá)式等功能,處理XML文檔的全新編程接口。
LINQ可以查詢或操作任何存儲(chǔ)形式的數(shù),如對(duì)象(集合、數(shù)組、字符串等)、關(guān)系(關(guān)系數(shù)據(jù)庫(kù)、ADO.NET數(shù)據(jù)集等)以及XML。LINQ架構(gòu)如圖13-1所示。圖13-1LINQ架構(gòu)13.2.1from子句13.2.2where子句13.2.3select子句13.2.4orderby子句13.2LINQ查詢常用子句LINQ查詢表達(dá)式必須包括from子句,且以from子句開(kāi)頭。from子句指定查詢操作的數(shù)據(jù)源和范圍變量。其中,數(shù)據(jù)源不但包括查詢本身的數(shù)據(jù)源,而且還包括子查詢的數(shù)據(jù)源。范圍變量一般用來(lái)表示源序列中的每一個(gè)元素。說(shuō)明:
如果查詢表達(dá)式還包括子查詢,那么子查詢表達(dá)式也必須以from子句開(kāi)頭?!纠?3-1】本實(shí)例在LINQ查詢表達(dá)式中使用from子句從int數(shù)組中查詢能被2整除的元素。代碼如下:protectedvoidPage_Load(objectsender,EventArgse){int[]values={1,2,3,4,5,6,7,8,9,0};varvalue=fromvinvalueswherev%2==0selectv;Response.Write("查詢結(jié)果:<br>");foreach(varvinvalue){Response.Write(v.ToString()+"<br>");}}13.2.1from子句運(yùn)行程序,效果如圖13-2所示。圖13-2from子句查詢結(jié)果在LINQ查詢表達(dá)式中,where子句指定篩選元素的邏輯條件,一般由邏輯運(yùn)算符(如邏輯與和邏輯或)組成。一個(gè)查詢表達(dá)式可以不包含where子句,也可以包含一個(gè)或多個(gè)where子句,每一個(gè)where子句可以包含一個(gè)或多個(gè)布爾條件表達(dá)式。注意:
對(duì)于一個(gè)LINQ查詢表達(dá)式而言,where子句不是必需的。如果where子句在查詢表達(dá)式中出現(xiàn),那么where子句不能作為查詢表達(dá)式的第一個(gè)子句或最后一個(gè)子句?!纠?3-2】本實(shí)例在查詢表達(dá)式中使用where子句,并且where子句由兩個(gè)布爾表達(dá)式和邏輯與&&組成。代碼如下:protectedvoidPage_Load(objectsender,EventArgse){int[]values={1,2,3,4,5,6,7,8,9,0};varvalue=fromvinvalueswherev%2==0&&v>2selectv;Response.Write("查詢結(jié)果:<br>");foreach(varvinvalue){Response.Write(v.ToString()+"<br>");}13.2.2where子句運(yùn)行程序,效果如圖13-3所示。圖13-3where子句查詢結(jié)果13.2.3select子句在LINQ查詢表達(dá)式中,select子句指定查詢結(jié)果的類(lèi)型和表現(xiàn)形式。LINQ查詢表達(dá)式必須以select子句或group子句結(jié)束。【例13-3】本實(shí)例演示了包含最簡(jiǎn)單select子句的查詢操作,代碼如下:protectedvoidPage_Load(objectsender,EventArgse){int[]values={1,2,3,4,5,6,7,8,9,0};varvalue=fromvinvalueswherev>5selectv;Response.Write("查詢結(jié)果:<br>");foreach(varvinvalue){Response.Write(v.ToString()+"<br>");}}運(yùn)行程序,效果如圖13-4所示。圖13-4select子句查詢結(jié)13.2.4orderby子句在LINQ查詢表達(dá)式中,orderby子句可以對(duì)查詢結(jié)果進(jìn)行排序,排序方式可以為“升序”或“降序”,且排序的主鍵可以是一個(gè)或多個(gè)。值得注意的是,LINQ查詢表達(dá)式對(duì)查詢結(jié)果的默認(rèn)排序方式為“升序”。說(shuō)明:
在LINQ查詢表達(dá)式中,orderby子句升序使用ascending關(guān)鍵字,降序使用descending關(guān)鍵字?!纠?3-4】本實(shí)例演示orderby子句對(duì)查詢的結(jié)果進(jìn)行排序。本示例實(shí)現(xiàn)的是將數(shù)據(jù)源中的數(shù)字按降序排序,然后使用foreach輸出查詢結(jié)果。代碼如下:protectedvoidPage_Load(objectsender,EventArgse){int[]values={3,8,6,4,1,5,7,0,9,2};varvalue=fromvinvalueswherev<3||v>7orderbyvdescendingselectv;//輸出查詢結(jié)果Response.Write("查詢結(jié)果:<br>");foreach(variinvalue){Response.Write(i+"<br>");}}運(yùn)行程序,效果如圖13-5所示。圖13-5orderby子句查詢結(jié)果排序13.3使用LINQ操作SQLServer數(shù)據(jù)庫(kù)13.3.1創(chuàng)建LINQ數(shù)據(jù)源13.3.2使用LINQ執(zhí)行操作數(shù)據(jù)庫(kù)13.3.3靈活運(yùn)用LinqDataSource控件13.3.1創(chuàng)建LINQ數(shù)據(jù)源使用LINQ查詢或操作數(shù)據(jù)庫(kù),需要建立LINQ數(shù)據(jù)源,LINQ數(shù)據(jù)源專(zhuān)門(mén)使用DBML文件作為數(shù)據(jù)源。下面以SQLServer2008數(shù)據(jù)庫(kù)為例,建立一個(gè)LINQ數(shù)據(jù)源,詳細(xì)步驟如下:(1)啟動(dòng)VisualStudio2010開(kāi)發(fā)環(huán)境,建立一個(gè)目標(biāo)框架為FrameworkSDKv4.0的ASP.NET空網(wǎng)站。(2)在“解決方案資源管理器”窗口中的App_Code文件夾上右擊,在彈出的快捷菜單中選擇“添加新項(xiàng)”命令,彈出“添加新項(xiàng)”對(duì)話框,如圖13-6所示。圖13-6添加新項(xiàng)
(3)在圖13-6所示的“添加新項(xiàng)”對(duì)話框中選擇“LINQtoSQL類(lèi)”,并輸入名稱,單擊“添加”按鈕,添加一個(gè)LinqToSql類(lèi)文件。(4)在“服務(wù)器資源管理器”窗口中連接SQLServer2008數(shù)據(jù)庫(kù),然后將指定數(shù)據(jù)庫(kù)中的表映射到LinqDB.dbml中(可以將表拖拽到設(shè)計(jì)視圖中),如圖13-7所示。圖13-7數(shù)據(jù)表映射到dbml文件(5)LinqDB.dbml文件將自動(dòng)創(chuàng)建一個(gè)名稱為L(zhǎng)inqDBDataContext的數(shù)據(jù)上下文類(lèi),為數(shù)據(jù)庫(kù)提供查詢或操作數(shù)據(jù)庫(kù)的方法,LINQ數(shù)據(jù)源創(chuàng)建完畢。LinqDBDataContext類(lèi)中的程序代碼均自動(dòng)生成,如圖13-8所示。圖13-8LinqDBDataContext類(lèi)中自動(dòng)生成程序代碼說(shuō)明:
根據(jù)以上操作,在App_Code文件夾下自動(dòng)生成LinqDB.dbml對(duì)應(yīng)的LinqDB.designer.cs文件。13.3.2使用LINQ執(zhí)行操作數(shù)據(jù)庫(kù)使用LINQ對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,如數(shù)據(jù)的添加、修改、刪除和查詢等,這些功能主要通過(guò)LINQ技術(shù)中的DataContext上下文類(lèi)來(lái)實(shí)現(xiàn)。1.查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù)使用LINQtoSQL查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù)與傳統(tǒng)的SQL語(yǔ)句或存儲(chǔ)過(guò)程相比更加簡(jiǎn)潔?!纠?3-5】本實(shí)例首先根據(jù)13.3.1節(jié)的步驟建立LINQ數(shù)據(jù)源連接數(shù)據(jù)庫(kù),然后通過(guò)生成的DataContext數(shù)據(jù)上下文類(lèi)訪問(wèn)數(shù)據(jù)庫(kù)中的數(shù)據(jù),并將數(shù)據(jù)綁定到GridView控件顯示留言信息。實(shí)例運(yùn)行效果如圖13-9所示。圖13-9LINQ查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù)程序開(kāi)發(fā)步驟如下:(1)新建一個(gè)網(wǎng)站,默認(rèn)主頁(yè)為Default.aspx。(2)根據(jù)13.3.1節(jié)的步驟建立LINQ數(shù)據(jù)源。(3)在Default.aspx頁(yè)面上添加一個(gè)GridView控件,用來(lái)顯示數(shù)據(jù)庫(kù)中的數(shù)據(jù)。(4)在Default.aspx.cs頁(yè)面的Page_Load事件中,首先聲明LinqDBDataContext類(lèi)的對(duì)象lqDB,然后使用LINQ查詢表達(dá)式查詢id大于0的查詢結(jié)果,并將查詢結(jié)果保存到result變量中,最后將result變量中存儲(chǔ)的結(jié)果設(shè)置為GridView控件的數(shù)據(jù)源,并且綁定數(shù)據(jù)顯示查詢結(jié)果。代碼如下:protectedvoidPage_Load(objectsender,EventArgse){LinqDBDataContextlqDB=newLinqDBDataContext(ConfigurationManager.ConnectionStrings["db_ASPNETConnectionString"].ConnectionString.ToString());varresult=fromrinlqDB.Leavewordwherer.id>0selectr;GridView1.DataSource=result;GridView1.DataBind();}
說(shuō)明:
建立LINQ數(shù)據(jù)源后,在Web.config文件中可以找到自動(dòng)生成的連接字符串,如上述代碼中的字符串db_ASPNETConnectionString。2.向數(shù)據(jù)庫(kù)中添加數(shù)據(jù)使用LINQtoSQL不僅可以實(shí)現(xiàn)查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù),而且還能夠?qū)崿F(xiàn)向數(shù)據(jù)庫(kù)中添加數(shù)據(jù)。實(shí)現(xiàn)該功能主要通過(guò)Tabel<T>泛型類(lèi)的InsertOnSubmit方法和DataContext類(lèi)的SubmitChanges方法,其中,InsertOnSubmit方法將單個(gè)實(shí)體的集合添加到Tabel<T>類(lèi)的實(shí)例中,SubmitChanges方法計(jì)算要插入、更新或刪除的已修改對(duì)象的集,并執(zhí)行相應(yīng)命令以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的更改。【例13-6】本實(shí)例在留言頁(yè)面上,輸入留言標(biāo)題、E-mail地址以及留言內(nèi)容,通過(guò)LINQ技術(shù)可以將留言信息保存到數(shù)據(jù)庫(kù)中。實(shí)例運(yùn)行效果如圖13-10所示。圖13-10LINQ向數(shù)據(jù)庫(kù)中添加數(shù)據(jù)13.3.3靈活運(yùn)用LinqDataSource控件LinqDataSource是一個(gè)新的數(shù)據(jù)源綁定控件,通過(guò)該控件可以直接插入、更新和刪除DataContext實(shí)體類(lèi)下的數(shù)據(jù),從而實(shí)現(xiàn)操作數(shù)據(jù)庫(kù)中數(shù)據(jù)的功能。說(shuō)明:
.NET下的所有數(shù)據(jù)綁定控件都可以通過(guò)LinqDataSource控件進(jìn)行數(shù)據(jù)綁定。下面介紹如何使用LinqDataSource控件配置數(shù)據(jù)源,從而通過(guò)數(shù)據(jù)綁定控件來(lái)查詢或操作數(shù)據(jù)?!纠?3-9】本實(shí)例在ASP.NET網(wǎng)站中首先建立LINQ數(shù)據(jù)源,然后使用LinqDataSource控件配置數(shù)據(jù)源,并作為GridView控件的綁定數(shù)據(jù)源。實(shí)例運(yùn)行效果如圖13-13所示。圖13-13使用LinqDataSource控件配置數(shù)據(jù)源程序開(kāi)發(fā)步驟如下:(1)新建一個(gè)網(wǎng)站,默認(rèn)主頁(yè)為Default.aspx。(2)根據(jù)13.3.1節(jié)的步驟建立LINQ數(shù)據(jù)源。(3)在Default.aspx頁(yè)面上添加一個(gè)LinqDataSource控件,單擊該控件右上角的“<”按鈕,選擇“配置數(shù)據(jù)源”命令。(4)在打開(kāi)的“選擇上下文對(duì)象”界面中,選擇步驟(2)中創(chuàng)建的上下文對(duì)象,如圖13-14所示。圖13-14“選擇上下文對(duì)象”界面(5)單擊“下一步”按鈕,在“配置數(shù)據(jù)選擇”界面中選擇數(shù)據(jù)表和字段(這里選擇“*”),如圖13-15所示。圖13-15“配置數(shù)據(jù)選擇”界面注意:
在Select列表框中必須選擇*,或者選擇所有字段,這樣才能正常使用LinqDataSource控件,也就是說(shuō),不能選擇部分字段,否則LinqDataSource控件將不支持自動(dòng)插入、更新、刪除等功能。(6)單擊“高級(jí)”按鈕,在“高級(jí)選項(xiàng)”對(duì)話框中選中所有選項(xiàng)(如圖13-16所示),單擊“確定”按鈕返回到“配置數(shù)據(jù)選擇”界面。圖13-16“高級(jí)選項(xiàng)”對(duì)話框說(shuō)明:
在“配置數(shù)據(jù)選擇”界面中單擊Where(W)按鈕或OrderBy(O)按鈕可以自定義查詢語(yǔ)句。(7)在“配置數(shù)據(jù)選擇”界面中單擊“完成”按鈕完成配置數(shù)據(jù)源。(8)在Default.aspx頁(yè)面上添加一個(gè)GridView控件,設(shè)置綁定的數(shù)據(jù)源為L(zhǎng)inqDataSource1即可開(kāi)發(fā)人員可以將LINQ查詢結(jié)果綁定到DropDownList控件,具體步驟為:首先聲明LinqDBDataContext類(lèi)對(duì)象lqDB;然后創(chuàng)建LINQ查詢表達(dá)式,并將查詢結(jié)果保存到result變量中;最后將result變量中存儲(chǔ)的結(jié)果設(shè)置為DropDownList控件的數(shù)據(jù)源,并指定要在DropDownList控件中顯示的字段。關(guān)鍵代碼如下:LinqDBDataContextlqDB=newLinqDBDataContext(ConfigurationManager.ConnectionStrings["db_CSharpConnectionString"].ConnectionString.ToString());//查詢要?jiǎng)h除的記錄varresult=fromrinlqDB.Leavewordwherer.id>0selectnew { Title=r.Title,};//設(shè)置綁定字段DropDownList1.DataTextField="Title";//綁定查詢結(jié)果DropDownList1.DataSource=result;DropDownList1.DataBind();13.4使用LINQ操作其他數(shù)據(jù)13.4.1使用LINQ操作數(shù)組和集合13.4.2使用LINQ操作DataSet數(shù)據(jù)集13.4.3使用LINQ操作XML文件13.4.1使用LINQ操作數(shù)組和集合對(duì)數(shù)組和集合進(jìn)行操作時(shí)可以使用LinqToObjects技術(shù),它是一種新的處理集合的方法,如果采用舊方法,程序開(kāi)發(fā)人員必須編寫(xiě)指定如何從集合檢索數(shù)據(jù)的復(fù)雜的foreach循環(huán),而采用LinqToObjects技術(shù),只需編寫(xiě)描述要檢索的內(nèi)容的聲明性代碼。LinqToObjects能夠直接使用LINQ查詢IEnumerable或IEnumerable<T>集合,而不需要使用LINQ提供程序或API,可以說(shuō),使用LINQ能夠查詢?nèi)魏慰擅杜e的集合,例如數(shù)組、泛型列表等。下面通過(guò)一個(gè)實(shí)例講解如何使用LINQ技術(shù)操作數(shù)組和集合?!纠?3-10】本實(shí)例主要演示如何使用LINQ技術(shù)從數(shù)組中查找及格范圍內(nèi)的分?jǐn)?shù),并循環(huán)訪問(wèn)查詢結(jié)果及輸出。實(shí)例運(yùn)行效果如圖13-17所示。圖13-17使用LINQ操作數(shù)組和集合程序開(kāi)發(fā)步驟如下:(1)新建一個(gè)網(wǎng)站,默認(rèn)主頁(yè)為Default.aspx。(2)在Default.aspx.cs頁(yè)面的Page_Load事件中,使用LINQ技術(shù)從數(shù)組中查找及格范圍內(nèi)的分?jǐn)?shù),然后循環(huán)訪問(wèn)查詢結(jié)果并輸出。代碼如下:protectedvoidPage_Load(objectsender,EventArgse){int[]intScores={45,68,80,90,75,76,32}; //定義int類(lèi)型的一維數(shù)組//使用LINQ技術(shù)從數(shù)組中查找及格范圍內(nèi)的分?jǐn)?shù)varscore=fromhgScroeinintScoreswherehgScroe>=60orderbyhgScroeascendingselecthgScroe;Response.Write("及格的分?jǐn)?shù):</br>");foreach(varvinscore) //循環(huán)訪問(wèn)查詢結(jié)果并顯示{Response.Write(v.ToString()+"</br>");}}13.4.2使用LINQ操作DataSet數(shù)據(jù)集對(duì)DataSet數(shù)據(jù)集進(jìn)行操作時(shí)可以使用LINQtoDataSet技術(shù),它是LINQtoADO.NET中的獨(dú)立技術(shù),使用LINQtoDataSet技術(shù)查詢DataSet對(duì)象更加方便快捷,下面對(duì)LINQtoDataSet技術(shù)中常用到的方法進(jìn)行詳細(xì)講解。(1)AsEnumerable方法AsEnumerable方法可以將DataTable對(duì)象轉(zhuǎn)換為EnumerableRowCollection<DataRow>對(duì)象,其語(yǔ)法格式如下:publicstaticEnumerableRowCollection<DataRow>AsEnumerable(thisDataTablesource)source:表示可枚舉的源DataTable。返回值:一個(gè)IEnumerable<T>對(duì)象,其泛型參數(shù)T為DataRow。(2)CopyToDataTable方法CopyToDataTable方法用來(lái)將IEnumerable<T>對(duì)象中的數(shù)據(jù)賦值到DataTable對(duì)象中,其語(yǔ)法格式如下:publicstaticDataTableCopyToDataTable<T>(thisIEnumerable<T>source)whereT:DataRowsource:源IEnumerable<T>序列。返回值:一個(gè)DataTable,其中包含作為DataRow對(duì)象的類(lèi)型的輸入序列。(3)AsDataView方法AsDataView方法用來(lái)創(chuàng)建并返回支持LINQ的DataView對(duì)象,其語(yǔ)法格式如下:publicstaticDataViewAsDataView<T>(thisEnumerableRowCollection<T>source)whereT:DataRowsource:從中創(chuàng)建支持LINQ的DataView的源LINQtoDataSet查詢。返回值:支持LINQ的DataView對(duì)象。(4)Take方法Take方法用來(lái)從序列的開(kāi)頭返回指定數(shù)量的連續(xù)元素,其語(yǔ)法格式如下:publicstaticIEnumerable<TSource>Take<TSource>(thisIEnumerable<TSource>source,intcount)source:表示要從其返回元素的序列。count:表示要返回的元素?cái)?shù)量。返回值:一個(gè)IEnumerable<T>,包含輸入序列開(kāi)頭的指定數(shù)量的元素。(5)Sum方法Sum方法用來(lái)計(jì)算數(shù)值序列之和,其語(yǔ)法格式如下:publicstaticdecimalSum(thisIEnumerable<decimal>source)source:一個(gè)要計(jì)算和的Decimal值序列。返回值:序列值之和。說(shuō)明:
上面介紹的幾種方法都有多種重載形式,這里只介紹其常用到的重載形式。
【例13-11】本實(shí)例主要演示如何使用LINQ技術(shù)獲取DataSet數(shù)據(jù)集中的數(shù)據(jù),并綁定在GridView控件中。實(shí)例運(yùn)行效果如圖13-18所示。圖13-18使用LINQ操作DataSet數(shù)據(jù)集程序開(kāi)發(fā)步驟如下:(1)新建一個(gè)網(wǎng)站,默認(rèn)主頁(yè)為Default.aspx。(2)在Default.aspx頁(yè)面上添加一個(gè)GridView控件,并設(shè)置其自動(dòng)套用格式為“藍(lán)黑1”,用來(lái)顯示DataSet數(shù)據(jù)集中的數(shù)據(jù)。(3)在Default.aspx.cs頁(yè)面的Page_Load事件中,首先將數(shù)據(jù)庫(kù)中的數(shù)據(jù)填充到DataSet數(shù)據(jù)集中,然后使用LINQ技術(shù)從DataSet數(shù)據(jù)集中查找信息并顯示在GridView控件中。代碼如下:protectedvoidPage_Load(objectsender,EventArgse){//定義數(shù)據(jù)庫(kù)連接字符串stringstrCon="DataSource=MRWXK\\MRWXK;Database=db_ASPNET;Uid=sa;Pwd=;";SqlConnectionsqlcon; //聲明SqlConnection對(duì)象SqlDataAdaptersqlda; //聲明SqlDataAdapter對(duì)象DataSetmyds; //聲明DataSet數(shù)據(jù)集對(duì)象sqlcon=newSqlConnection(strCon); //創(chuàng)建數(shù)據(jù)庫(kù)連接對(duì)象//創(chuàng)建數(shù)據(jù)庫(kù)橋接器對(duì)象sqlda=newSqlDataAdapter("select*fromtb_mrbccd",sqlcon);myds=newDataSet(); //創(chuàng)建數(shù)據(jù)集對(duì)象sqlda.Fill(myds,"tb_mrbccd"); //填充DataSet數(shù)據(jù)集//使用LINQ從數(shù)據(jù)集中查詢所有數(shù)據(jù)varquery=fromsalaryinmyds.Tables["tb_mrbccd"].AsEnumerable()selectsalary;DataTablemyDTable=query.CopyToDataTable<DataRow>();//將查詢結(jié)果轉(zhuǎn)化為DataTableGridView1.DataSource=myDTable; //顯示查詢到的數(shù)據(jù)集中的信息GridView1.DataBind();}13.4.3使用LINQ操作XML文件對(duì)XML文件進(jìn)行操作時(shí)可以使用LINQtoXML技術(shù),它是LINQ技術(shù)中的一種,它提供了修改文檔對(duì)象模型的內(nèi)存文檔,并支持LINQ查詢表達(dá)式等功能,下面對(duì)LINQtoXML技術(shù)中常用到的方法進(jìn)行詳細(xì)講解。(1)XElement類(lèi)的Load方法Xelement類(lèi)表示一個(gè)XML元素,其Load方法用來(lái)從文件加載Xelement,該方法語(yǔ)法格式如下:publicstaticXElementLoad(stringuri)uri:一個(gè)URI字符串,用來(lái)引用要加載到新XElement中的文件。返回值:一個(gè)包含所指定文件的內(nèi)容的XElement。(2)XElement類(lèi)的SetAttributeValue方法SetAttributeValue方法用來(lái)設(shè)置屬性的值、添加屬性或移除屬性,其語(yǔ)法格式如下:publicvoidSetAttributeValue(XNamename,Objectvalue)name:一個(gè)XName,其中包含要更改的屬性的名稱。value:分配給屬性的值。如果該值為null,則移除該屬性;否則,會(huì)將值轉(zhuǎn)換為其字符串表示形式,并分配給該屬性的Value屬性。(3)XElement類(lèi)的Add方法Add方法用來(lái)將指定的內(nèi)容添加為此XContainer的子級(jí),其語(yǔ)法格式如下:publicvoidAdd(Objectcontent)參數(shù)content表示要添加的包含簡(jiǎn)單內(nèi)容的對(duì)象或內(nèi)容對(duì)象集合。(4)XElement類(lèi)的ReplaceNodes方法ReplaceNodes方法用來(lái)使用指定的內(nèi)容替換此文檔或元素的子節(jié)點(diǎn),其語(yǔ)法格式如下:publicvoidReplaceNodes(Objectcontent)參數(shù)content表示一個(gè)用于替換子節(jié)點(diǎn)的包含簡(jiǎn)單內(nèi)容的對(duì)象或內(nèi)容對(duì)象集合。(5)XElement類(lèi)的Save方法Save方法用來(lái)序列化此元素的基礎(chǔ)XML樹(shù),可以將輸出保存到文件、XmlTextWriter、TextWriter或XmlWriter,其語(yǔ)法格式如下:publicvoidSave(stringfileName)參數(shù)fileName表示一個(gè)包含文件名稱的字符串。(6)XDocument類(lèi)的Save方法XDocument類(lèi)表示XML文檔,其Save方法用來(lái)將此XDocument序列化為文件、TextWriter或XmlWriter,該方法語(yǔ)法格式如下:publicvoidSave(stringfileName)參數(shù)fileName表示一個(gè)包含文件名稱的字符串。(7)XDeclaration類(lèi)XDeclaration類(lèi)表示一個(gè)XML聲明,其構(gòu)造函數(shù)語(yǔ)法格式如下:publicXDeclaration(stringversion,stringencoding,stringstandalone)version:XML的版本,通常為“1.0”。encoding:XML文檔的編碼。standalone:包含“yes”或“no”的字符串,用來(lái)指定XML是獨(dú)立的還是需要解析外部實(shí)體。說(shuō)明:使用LINQtoXML技術(shù)中的類(lèi)時(shí),需要添加System.Xml.Linq命名空間?!纠?3-12】本實(shí)例主要演示如何使用LINQ技術(shù)對(duì)XML文件進(jìn)行添加、修改、刪除及查詢等操作。實(shí)例運(yùn)行效果如圖13-19所示。圖13-19使用LINQ操作XML文件程序開(kāi)發(fā)步驟如下:(1)新建一個(gè)網(wǎng)站,默認(rèn)主頁(yè)為Default.aspx。(2)在Default.aspx頁(yè)面上添加兩個(gè)TextBox控件,分別用來(lái)輸入和顯示姓名、薪水;添加一個(gè)DropDownList控件,用來(lái)選擇性別;添加3個(gè)Button控件,分別用來(lái)執(zhí)行添加、修改和刪除操作;添加一個(gè)GridView控件,用來(lái)顯示XML文件中的數(shù)據(jù)。(3)在Default.aspx.cs代碼頁(yè)中,首先定義兩個(gè)字符串類(lèi)型的全局變量,分別用來(lái)記錄XML文件路徑及選中的ID編號(hào),代碼如下:staticstringstrPath=""; //記錄XML文件路徑staticstringstrID=""; //記錄選中的ID編號(hào)(4)在Default.aspx.cs代碼頁(yè)中自定義一個(gè)getXmlInfo方法,該方法為用來(lái)將XML文件中的內(nèi)容綁定到GridView控件中。getXmlInfo方法實(shí)現(xiàn)代碼如下:#region將XML文件內(nèi)容綁定到DataGridView控件///<summary>///將XML文件內(nèi)容綁定到DataGridView控件///</summary>privatevoidgetXmlInfo(){DataSetmyds=newDataSet(); //創(chuàng)建DataSet數(shù)據(jù)集對(duì)象myds.ReadXml(strPath); //讀取XML結(jié)構(gòu)GridView1.DataSource=myds.Tables[0]; //在DataGridView中顯示XML文件中的信息GridView1.DataKeyNames=newstring[]{"ID"};//綁定主鍵字段GridView1.DataBind();}#endregion(5)Default頁(yè)面加載時(shí),調(diào)用自定義的getXmlInfo方法將XML文件中的數(shù)據(jù)顯示在GridView控件。代碼如下:protectedvoidPage_Load(objectsender,EventArgse)strPath=Server.MapPath("Employee.xml"); //記錄XML文件路徑if(!IsPostBack)getXmlInfo(); //頁(yè)面加載時(shí)加載XML文件(6)單擊“添加”按鈕,使用LinqToXML技術(shù)向指定的XML文件中插入用戶輸入的數(shù)據(jù),并重新保存XML文件?!疤砑印卑粹o的Click事件代碼如下:protectedvoidButton1_Click(objectsender,EventArgse)XElementxe=XElement.Load(strPath); //加載XML文檔//創(chuàng)建IEnumerable泛型接口IEnumerable<XElement>elements1=fromelementinxe.Elements("People")selectelement;//生成新的編號(hào)stringstr=(Convert.ToInt32(elements1.Max(element=>element.Attribute("ID").Value))+1).ToString("000");XElementpeople=newXElement( //創(chuàng)建XML元素"People",newXAttribute("ID",str), //為XML元素設(shè)置屬性newXElement("Name",TextBox1.Text),newXElement("Sex",DropDownList1.Text),newXElement("Salary",TextBox2.Text));xe.Add(people); //添加X(jué)ML元素xe.Save(strPath); //保存XML元素到XML文件getXmlInfo();}(7)當(dāng)用戶在GridView控件中選擇某記錄時(shí),使用LinqToXML技術(shù)在XML文件中查找選中記錄的詳細(xì)信息,并顯示到相應(yīng)的文本框和下拉列表中。實(shí)現(xiàn)代碼如下:protectedvoidGridView1_SelectedIndexChanging(objectsender,GridViewSelectEventArgse){//記錄選中的ID編號(hào)strID=GridView1.DataKeys[e.NewSelectedIndex].Value.ToString();XElementxe=XElement.Load(strPath); //加載XML文檔//根據(jù)編號(hào)查找信息IEnumerable<XElement>elements=fromPInfoinxe.Elements("People")wherePInfo.Attribute("ID").Value==strIDselectPInfo;foreach(XElementelementinelements) //遍歷查找到的所有信息{TextBox1.Text=element.Element("Name").Value; //顯示員工姓名DropDownList1.Text=element.Element("Sex").Value;//顯示員工性別TextBox2.Text=element.Element("Salary").Value; //顯示員工薪水}}(8)單擊“修改”按鈕,首先判斷是否選定要修改的記錄,如果已經(jīng)選定,則使用LinqToXML技術(shù)修改XML文件中的指定記錄,并重新保存XML文件?!靶薷摹卑粹o的Click事件代碼如下:protectedvoidButton2_Click(objectsender,EventArgse){if(strID!="") //判斷是否選擇了編號(hào){XElementxe=XElement.Load(strPath); //加載XML文檔//根據(jù)編號(hào)查找信息IEnumerable<XElement>elements=fromelementinxe.Elements("People")whereelement.Attribute("ID").Value==strIDselectelement;if(elements.Count()>0) //判斷是否找到了信息{XElementnewXE=elements.First(); //獲取找到的第一條記錄newXE.SetAttributeValue("ID",strID); //為XML元素設(shè)置屬性值newXE.ReplaceNodes( //替換XML元素中的值newXElement("Name",TextBox1.Text),newXElement("Sex",DropDownList1.Text),newXElement("Salary",TextBox2.Text));}xe.Save(strPath); //保存XML元素到XML文件}getXmlInfo();}(9)單擊“刪除”按鈕,首先判斷是否選定要?jiǎng)h除的記錄,如果已經(jīng)選定,則使用LinqToXML技術(shù)刪除XML文件中的指定記錄,并重新保存XML文件?!皠h除”按鈕的Click事件代碼如下:protectedvoidButton3_Click(objectsender,EventArgse){if(strID!="") //判斷是否選擇了編號(hào){XElementxe=XElement.Load(strPath); //加載XML文檔//根據(jù)編號(hào)查找信息IEnumerable<XElement>elements=fromelementinxe.Elements("People")whereelement.Attribute("ID").Value==strIDselectelement;if(elements.Count()>0) //判斷是否找到了信息elements.First().Remove(); //刪除找到的XML元素信息xe.Save(strPath); //保存XML元素到XML文件}getXmlInfo();}13.5綜合實(shí)例——使用LINQ實(shí)現(xiàn)數(shù)據(jù)分頁(yè)使用GridView控件呈現(xiàn)數(shù)據(jù)時(shí),一般都需要對(duì)其進(jìn)行分頁(yè)顯示,分頁(yè)方式上通常采用的是GridView自帶的分頁(yè)功能,但這種分頁(yè)方式擴(kuò)展性差,最主要的是它不能實(shí)現(xiàn)真正意義上的分頁(yè),即每次從數(shù)據(jù)庫(kù)只讀取當(dāng)前頁(yè)的數(shù)據(jù)。本實(shí)例使用LINQ技術(shù)實(shí)現(xiàn)對(duì)GridView控件中數(shù)據(jù)進(jìn)行分頁(yè)顯示的功能,實(shí)例運(yùn)行結(jié)果如圖13-20所示。圖13-20使用LINQ實(shí)現(xiàn)數(shù)據(jù)分頁(yè)程序開(kāi)發(fā)步驟如下:(1)新建一個(gè)ASP.NET網(wǎng)站,命名為L(zhǎng)inqPager,默認(rèn)主頁(yè)為Default.aspx。(2)在Default.aspx頁(yè)面中添加一個(gè)GridView控件,用來(lái)顯示數(shù)據(jù)庫(kù)中的商品信息;添加4個(gè)LinkButton控件,分別用來(lái)作為首頁(yè)、上一頁(yè)、下一頁(yè)和尾頁(yè)按鈕。(3)按照13.3.1節(jié)的步驟建立LINQ數(shù)據(jù)源,數(shù)據(jù)源為db_ASPNET數(shù)據(jù)庫(kù)中的Goods數(shù)據(jù)表。(4)Default.aspx頁(yè)面的后臺(tái)代碼中,首先創(chuàng)建LINQ對(duì)象,并定義每頁(yè)顯示的記錄數(shù),代碼如下:LinqDBDataContextldc=newLinqDBDataContext(); //創(chuàng)建LINQ對(duì)象intpageSize=3; //設(shè)置每頁(yè)顯示3行記錄(5)自定義一個(gè)getCount方法,該方法用來(lái)計(jì)算表中的數(shù)據(jù)一共可以分為多少頁(yè)。在該方法中,首先獲取總的數(shù)據(jù)行數(shù),并通過(guò)總數(shù)據(jù)行數(shù)除以每頁(yè)顯示的行數(shù)獲取可分的頁(yè)數(shù);然后使用計(jì)算出的總數(shù)據(jù)行數(shù)對(duì)每頁(yè)顯示的行數(shù)求余,如果求余大于0,將獲取1,否則獲取0;最后將兩個(gè)數(shù)相加并返回。代碼如下:protectedintgetCount(){intsum=ldc.Goods.Count(); //設(shè)置總數(shù)據(jù)行數(shù)ints1=sum/pageSize; //獲取可以分的頁(yè)面//當(dāng)總行數(shù)對(duì)頁(yè)數(shù)求余后是否大于0,如果大于獲取1否則獲取0ints2=sum%pageSize>0?1:0;intcount=s1+s2; //計(jì)算出總頁(yè)數(shù)returncount;}(6)自定義一個(gè)bindGrid方法,該方法用來(lái)對(duì)數(shù)據(jù)表中的數(shù)據(jù)進(jìn)行分頁(yè)操作,并將分頁(yè)后的結(jié)果綁定到GridView控件上。代碼如下:protectedvoidbindGrid()//獲取當(dāng)前頁(yè)數(shù)intpageIndex=Convert.ToInt32(ViewState["pageIndex"]);//使用LINQ查詢,并對(duì)查詢的數(shù)據(jù)進(jìn)行分頁(yè)varresult=(fromvinldc.Goodsselectnew商品編號(hào)=v.goodsID,
商品名稱
=v.goodsName,
商品價(jià)格
=v.goodsPrice,
銷(xiāo)售數(shù)量
=v.sumSell}).Skip(pageSize*pageIndex).Take(pageSize);gvGoods.DataSource=result; //設(shè)置GridView控件的數(shù)據(jù)源gvGoods.DataBind(); //綁定GridView控件lnkbtnBottom.Enabled=true;lnkbtnFirst.Enabled=true;lnkbtnUp.Enabled=true;lnkbtnDown.Enabled=true;//判斷是否為第一頁(yè),如果為第一頁(yè)隱藏首頁(yè)和上一頁(yè)按鈕if(Convert.ToInt32(ViewState[“pageIndex”])==0)lnkbtnFirst.Enabled=false;lnkbtnUp.Enabled=false;//判斷是否為最后一頁(yè),如果為最后一頁(yè)隱藏尾頁(yè)和下一頁(yè)按鈕if(Convert.ToInt32(ViewState[“pageIndex”])==getCount()-1)lnkbtnBottom.Enabled=false;lnkbtnDown.Enabled=false;}(7)Default.aspx頁(yè)面加載時(shí),首先設(shè)置當(dāng)前的頁(yè)數(shù),然后調(diào)用自定義bindGrid方法實(shí)現(xiàn)分頁(yè)功能。代碼如下:protectedvoidPage_Load(objectsender,EventArgse){if(!IsPostBack){ViewState["pageIndex"]=0; //設(shè)置當(dāng)前頁(yè)面//調(diào)用自定義bindGrid方法綁定GridView控件bindGrid();}}說(shuō)明:
在ASP.NET中,ViewState是ASP.NET頁(yè)在頁(yè)面切換時(shí)保留頁(yè)和控件屬性值的默認(rèn)方法。本實(shí)例將當(dāng)前頁(yè)碼保存在了ViewState["pageIndex"]中。(8)在“首頁(yè)”、“上一頁(yè)”、“
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年統(tǒng)編版2024必修3生物下冊(cè)階段測(cè)試試卷
- 二零二五年度成都房產(chǎn)買(mǎi)賣(mài)合同糾紛調(diào)解協(xié)議書(shū)4篇
- 二零二五年度雛雞養(yǎng)殖基地與金融機(jī)構(gòu)信貸支持合同4篇
- 2025年粵教滬科版九年級(jí)歷史下冊(cè)月考試卷含答案
- 2025年華師大版九年級(jí)歷史上冊(cè)月考試卷含答案
- 2025年浙科版九年級(jí)科學(xué)上冊(cè)月考試卷
- 2025年度個(gè)人投資理財(cái)?shù)盅悍磽?dān)保合同標(biāo)準(zhǔn)3篇
- 2025承包合同 商店承包合同
- 2025土地使用權(quán)轉(zhuǎn)讓合同(律師擬定版本)
- 2025年度船舶涂裝環(huán)保技術(shù)應(yīng)用合作協(xié)議3篇
- 口腔醫(yī)學(xué)中的人工智能應(yīng)用培訓(xùn)課件
- 工程質(zhì)保金返還審批單
- 【可行性報(bào)告】2023年電動(dòng)自行車(chē)項(xiàng)目可行性研究分析報(bào)告
- 五月天歌詞全集
- 商品退換貨申請(qǐng)表模板
- 實(shí)習(xí)單位鑒定表(模板)
- 六西格瑪(6Sigma)詳解及實(shí)際案例分析
- 機(jī)械制造技術(shù)-成都工業(yè)學(xué)院中國(guó)大學(xué)mooc課后章節(jié)答案期末考試題庫(kù)2023年
- 數(shù)字媒體應(yīng)用技術(shù)專(zhuān)業(yè)調(diào)研方案
- 2023年常州市新課結(jié)束考試九年級(jí)數(shù)學(xué)試卷(含答案)
- 正常分娩 分娩機(jī)制 助產(chǎn)學(xué)課件
評(píng)論
0/150
提交評(píng)論