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