asp.net3.5從入門到精通9_第1頁
asp.net3.5從入門到精通9_第2頁
asp.net3.5從入門到精通9_第3頁
asp.net3.5從入門到精通9_第4頁
asp.net3.5從入門到精通9_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

·PAGE218·./WORD格式整理第9章ASP.NET操作數(shù)據(jù)庫通過對ADO.NET的基本講解,以及講解了一些數(shù)據(jù)源控件的基本用法后,本章將介紹一些ASP.NET操作數(shù)據(jù)庫的高級用法,包括使用SQLHelper,以及數(shù)據(jù)源控件對數(shù)據(jù)的操作。本章是對前面的數(shù)據(jù)庫知識的一種補(bǔ)充和提升。9.1使用ADO.NET操作數(shù)據(jù)庫上一章中介紹了ADO.NET的基本概念、ADO.NET的對象,以及如何使用ADO.NET。使用ADO.NET能夠極大的方便開發(fā)人員對數(shù)據(jù)庫進(jìn)行操作而無需關(guān)心數(shù)據(jù)庫底層之間的運(yùn)行,ADO.NET不僅包括多個(gè)對象,同樣包括多種方法,這些方法都可以用來執(zhí)行開發(fā)人員指定的SQL語句,但是這些方法實(shí)現(xiàn)過程又不盡相同,本節(jié)將介紹ADO.NET中數(shù)據(jù)的操作方法。使用ExecuteReader<>操作數(shù)據(jù)庫使用ExecuteReader<>操作數(shù)據(jù)庫,ExecuteReader<>方法返回的是一個(gè)SqlDataReader對象或OleDbDataReader對象。當(dāng)使用DataReader對象時(shí),不會像DataSet那樣提供無連接的數(shù)據(jù)庫副本,DataReader類被設(shè)計(jì)為產(chǎn)生只讀、只進(jìn)的數(shù)據(jù)流。這些數(shù)據(jù)流都是從數(shù)據(jù)庫返回的。所以,每次的訪問或操作只有一個(gè)記錄保存在服務(wù)器的內(nèi)存中。相比與DataSet而言,DataReader具有較快的訪問能力,并且能夠使用較少的服務(wù)器資源。DataReader對象提供了"游標(biāo)"形式的讀取方法,當(dāng)從結(jié)果中讀取了一行,則"游標(biāo)"會繼續(xù)讀取到下一行。通過Read方法可以判斷數(shù)據(jù)是否還有下一行,如果存在數(shù)據(jù),則繼續(xù)運(yùn)行并返回true,否則返回false。示例代碼如下所示。stringstr="server='<local>';database='mytable';uid='sa';pwd='sa'";SqlConnectioncon=newSqlConnection<str>;con.Open<>; //打開連接stringstrsql="select*frommynews"; //SQL查詢語句SqlCommandcmd=newSqlCommand<strsql,con>; //初始化Command對象SqlDataReaderrd=cmd.ExecuteReader<>; //初始化DataReader對象while<rd.Read<>>{Response.Write<rd["title"].ToString<>>; //通過索引獲取列}DataReader可以提高執(zhí)行效率,有兩種方式可以提高代碼的性能,一種是基于序號的查詢;第二種情況則是使用適當(dāng)?shù)腉et方法來查詢。一般來說,在數(shù)據(jù)庫的設(shè)計(jì)中,需要設(shè)計(jì)索引鍵或主鍵來標(biāo)識,在主鍵的設(shè)計(jì)中,自動增長類型是經(jīng)常使用的,自動增長類型通常為整型,所以基于序號的查詢可以使用DataReader,示例代碼如下所示。stringstr="server='<local>';database='mytable';uid='sa';pwd='sa'"; //設(shè)置連接字串SqlConnectioncon=newSqlConnection<str>; //創(chuàng)建連接對象con.Open<>; //打開連接stringstrsql="select*frommynewswhereid=1orderbyiddesc"; //按標(biāo)識查詢SqlCommandcmd=newSqlCommand<strsql,con>; //創(chuàng)建Command對象SqlDataReaderrd=cmd.ExecuteReader<>; //創(chuàng)建DataReader對象while<rd.Read<>> //遍歷數(shù)據(jù)庫{Response.Write<rd["title"].ToString<>>; //讀取相應(yīng)行的信息}當(dāng)使用ExecuteReader<>操作數(shù)據(jù)庫時(shí),會遇到知道某列的名稱而不知道某列的號的情況,這種情況可以通過使用DataReader對象的GetOrdinal<>方法獲取相應(yīng)的列號。此方法接收一個(gè)列名并返回此列名所在的列號,示例代碼如下所示。stringstr="server='<local>';database='mytable';uid='sa';pwd='sa'"; //創(chuàng)建連接字串SqlConnectioncon=newSqlConnection<str>; //創(chuàng)建連接對象con.Open<>; //打開連接stringstrsql="select*frommynewswhereid=1orderbyiddesc"; //創(chuàng)建執(zhí)行SQL語句SqlCommandcmd=newSqlCommand<strsql,con>; //創(chuàng)建Command對象SqlDataReaderrd=cmd.ExecuteReader<>; //創(chuàng)建DataReader對象intid=rd.GetOrdinal<"title">; //使用GetOrdinal方法獲取title列的列號while<rd.Read<>> //遍歷DataReader對象{Label1.Text="新聞id是"+rd["id"]; //輸出對象的值}當(dāng)完成數(shù)據(jù)庫操作時(shí),需要關(guān)閉數(shù)據(jù)庫連接,DataReader對象在調(diào)用Close<>方法即關(guān)閉與數(shù)據(jù)庫的連接,如果在沒有關(guān)閉之前又打開另一個(gè)連接,系統(tǒng)會拋出異常。示例代碼如下所示。rd.Close<>; //關(guān)閉DataReader對象ExecuteReader<>可以執(zhí)行相應(yīng)的SQL語句,例如插入、更新以及刪除等,當(dāng)需要執(zhí)行插入、更新或刪除時(shí),可以使用ExecuteReader<>進(jìn)行數(shù)據(jù)操作,示例代碼如下所示。stringstr="server='<local>';database='mytable';uid='sa';pwd='sa'"; //創(chuàng)建連接字串SqlConnectioncon=newSqlConnection<str>; //創(chuàng)建連接對象con.Open<>; //打開連接stringstrsql="insertintomynewsvalues<'執(zhí)行更新后的標(biāo)題'>"; //創(chuàng)建執(zhí)行SQL語句SqlCommandcmd=newSqlCommand<strsql,con>; //創(chuàng)建Command對象SqlDataReaderrd=cmd.ExecuteReader<>; //使用ExcuteReader<>方法while<rd.Read<>> //讀取數(shù)據(jù)庫{Response.Write<rd["title"].ToString<>+"<hr/>">;}rd.Close<>; //關(guān)閉DataReader對象Response.Redirect<"ExecuteReader.aspx">;當(dāng)執(zhí)行了插入、刪除等數(shù)據(jù)庫操作時(shí),ExecuteReader返回為空的DataReader對象。當(dāng)使用Read方法遍歷讀取數(shù)據(jù)庫時(shí),并不會顯示相應(yīng)的數(shù)據(jù)信息,因?yàn)椴皇遣樵冋Z句,則類型的集〔EOF,但是ExecuteReader方法可以執(zhí)行SQL語句。如圖9-1所示。圖9-1ExecuteReader<>執(zhí)行查詢和事務(wù)處理使用ExecuteReader<>操作數(shù)據(jù)庫,通常情況下是使用ExecuteReader<>進(jìn)行數(shù)據(jù)庫查詢操作,使用ExecuteReader<>查詢數(shù)據(jù)庫能夠提升查詢效率,而如果需要進(jìn)行數(shù)據(jù)庫事務(wù)處理的話,ExecuteReader<>方法并不是理想的選擇。使用ExecuteNonQuery<>操作數(shù)據(jù)庫使用ExecuteNonQuery<>操作數(shù)據(jù)庫時(shí),ExecuteNonQuery<>并不返回DataReader對象,返回的是一個(gè)整型的值,代表執(zhí)行某個(gè)SQL語句后,在數(shù)據(jù)庫中影響的行數(shù),示例代碼如下所示。stringstr="server='<local>';database='mytable';uid='sa';pwd='sa'"; //創(chuàng)建連接字串SqlConnectioncon=newSqlConnection<str>; //創(chuàng)建連接對象con.Open<>; //打開連接stringstrsql="selecttop5*frommynewsorderbyiddesc";SqlCommandcmd=newSqlCommand<strsql,con>; //使用ExecuteNonQueryLabel1.Text="該操作影響了"+cmd.ExecuteNonQuery<>+"行"; //執(zhí)行SQL語句并返回行上述代碼使用了SELECT語句,并執(zhí)行語句,返回受影響的行數(shù)。運(yùn)行后,發(fā)現(xiàn)返回的結(jié)果為-1,說明,當(dāng)使用SELECT語句時(shí),并沒有對任何行有任何影響。ExecuteNonQuery<>通常情況下為數(shù)據(jù)庫事務(wù)處理的首選,當(dāng)需要執(zhí)行插入、刪除、更新等操作時(shí),首選ExecuteNonQuery<>。對于更新、插入和刪除的SQL句,ExecuteNonQuery<>方法的返回值為該命令所影響的行數(shù)。對于"CREATETABLE"和"DROPTABLE"語句,返回值為0,而對于所有其他類型的語句,返回值為-1。ExecuteNonQuery<>操作數(shù)據(jù)時(shí),可以不使用DataSet直接更改數(shù)據(jù)庫中的數(shù)據(jù),示例代碼如下所示。protectedvoidButton1_Click<objectsender,EventArgse>{stringstr="server='<local>';database='mytable';uid='sa';pwd='sa'"; //創(chuàng)建連接字串SqlConnectioncon=newSqlConnection<str>; //創(chuàng)建連接對象con.Open<>; //打開連接stringstrsql="deletefrommynewswhereid>4"; //編寫執(zhí)行刪除的SQL語句SqlCommandcmd=newSqlCommand<strsql,con>; //創(chuàng)建Command對象Label1.Text="該操作影響了"+cmd.ExecuteNonQuery<>+"行"; //返回影響行數(shù)}運(yùn)行上述代碼后,會執(zhí)行刪除id號大于4的數(shù)據(jù)事務(wù),當(dāng)執(zhí)行刪除并刪除完畢后,則ExecuteNonQuery<>方法返回受影響的行數(shù),如圖9-2所示。圖9-2ExecuteNonQuery<>方法ExecuteNonQuery<>操作主要進(jìn)行數(shù)據(jù)庫操作,包括更新、插入和刪除等操作,并返回相應(yīng)的行數(shù)。在進(jìn)行數(shù)據(jù)庫事務(wù)處理時(shí)或不需要DataSet為數(shù)據(jù)庫進(jìn)行更新時(shí),ExecuteNonQuery<>方法是數(shù)據(jù)操作的首選。因?yàn)镋xecuteNonQuery<>支持多種數(shù)據(jù)庫語句的執(zhí)行。注意:有些項(xiàng)目中,通過判斷ExecuteNonQuery<>的返回值來判斷SQL語句是否執(zhí)行成功,這樣是有失偏頗的,因?yàn)楫?dāng)使用創(chuàng)建表的語句時(shí),就算執(zhí)行成功也會返回-1。使用ExecuteScalar<>操作數(shù)據(jù)庫ExecuteScalar<>方法也用來執(zhí)行SQL語句,但是ExecuteScalar<>執(zhí)行SQL語句后的返回值與ExecuteNonQuery<>并不相同,ExecuteScalar<>方法的返回值的數(shù)據(jù)類型是Object類型。如果執(zhí)行的SQL語句是一個(gè)查詢語句〔SELECT,則返回結(jié)果是查詢后的第一行的第一列,如果執(zhí)行的SQL語句不是一個(gè)查詢語句,則會返回一個(gè)未實(shí)例化的對象,必須通過類型轉(zhuǎn)換來顯示,示例代碼如下所示。stringstr="server='<local>';database='mytable';uid='sa';pwd='sa'"; //創(chuàng)建連接字串SqlConnectioncon=newSqlConnection<str>; //創(chuàng)建連接對象con.Open<>; //打開連接stringstrsql="select*frommynewsorderbyiddesc";SqlCommandcmd=newSqlCommand<strsql,con>;Label1.Text="查詢出了Id為"+cmd.ExecuteScalar<>\; //使用ExecuteScalar查詢通常情況下ExecuteNonQuery<>操作后返回的是一個(gè)值,而ExecuteScalar<>操作后則會返回一個(gè)對象,ExecuteScalar<>經(jīng)常使用于當(dāng)需要返回單一值時(shí)的情況。例如當(dāng)插入一條數(shù)據(jù)信息時(shí),常常需要馬上知道剛才插入的值,則可以使用ExecuteScalar<>方法。示例代碼如下所示。stringstr="server='<local>';database='mytable';uid='sa';pwd='sa'"; //創(chuàng)建連接字串SqlConnectioncon=newSqlConnection<str>; //創(chuàng)建連接對象con.Open<>; //打開連接stringstrsql="insertintomynewsvalues<'剛剛插入的id是多少?'>SELECT@@IDENTITYas'bh'"; //插入語句SqlCommandcmd=newSqlCommand<strsql,con>; //執(zhí)行語句Label1.Text="剛剛插入的行的id是"+cmd.ExecuteScalar<>; //返回賦值上述代碼使用了SELECT@@IDENTITY語法獲取剛剛執(zhí)行更新后的id值,然后通過使用ExecuteScalar<>方法來獲取剛剛更新后第一行第一列的值。使用ExecuteXmlReader<>操作數(shù)據(jù)庫ExecuteXmlReader<>方法用于操作XML數(shù)據(jù)庫,并返回一個(gè)XmlReader對象,若需要使用ExecuteXmlReader<>方法,則必須添加引用System.Xml。XmlReader類似于DataReader,都需要通過Command對象的ExecuteXmlReader<>方法來創(chuàng)建XmlReader的對象并初始化,示例代碼如下所示。XmlReaderxdr=cmd.ExecuteXmlReader<>; //創(chuàng)建XmlReader對象ExecuteXmlReader<>返回XmlReader對象,XmlReader特性如下所示:XMLReader是面向流的,它把XML文檔看作是文本數(shù)據(jù)流。XMLReader是一個(gè)抽象類。XMLReader使用pull模式處理流。三個(gè)派生類:XMLTextReader、XMLNodeReader和XMLValidatingReader下面代碼實(shí)現(xiàn)了獲取當(dāng)前節(jié)點(diǎn)中屬性的個(gè)數(shù)。stringstr="server='<local>';database='mytable';uid='sa';pwd='sa'"; //創(chuàng)建連接字串SqlConnectioncon=newSqlConnection<str>; //創(chuàng)建連接對象con.Open<>; //打開連接stringstrsql="select*frommynewsorderbyiddescFORXMLAUTO,XMLDATA";SqlCommandcmd=newSqlCommand<strsql,con>; //創(chuàng)建Command對象XmlReaderxdr=cmd.ExecuteXmlReader<>; //創(chuàng)建XmlReader對象Response.Write<xdr.AttributeCount>; //讀取節(jié)點(diǎn)個(gè)數(shù)上述代碼使用了SQL語言中的FORXMLAUTO,、XMLDATA關(guān)鍵字,當(dāng)執(zhí)行ExecuteXmlReader<>方法時(shí),會返回XmlReader對象,若不指定FORXMLAUTO,、XMLDATA關(guān)鍵字,則系統(tǒng)會拋出異常。9.2ASP.NET創(chuàng)建和插入記錄在數(shù)據(jù)庫操作中,經(jīng)常需要對數(shù)據(jù)庫中的內(nèi)容進(jìn)行插入操作。例如當(dāng)有一個(gè)用戶發(fā)布了評論,或者一個(gè)用戶要購買某個(gè)商品,都需要插入記錄來保存用戶的相應(yīng)的信息,以便當(dāng)用戶再次登錄網(wǎng)站或應(yīng)用時(shí),能夠及時(shí)獲取自己購買的信息。SQLINSERT數(shù)據(jù)插入語句使用SQLINSERT語句能夠?qū)崿F(xiàn)數(shù)據(jù)庫的插入,SQL語句必須遵照一些規(guī)范,SQLINSERT語句的一般語法形式如下所示:INSERT[INTO]{table_name}{[<column_list>]{VALUES<{DEFAULT|NULL|expression}[,…n]>}}上述代碼規(guī)范了INSERT語句的編寫規(guī)范,其中:INSERT是SQL插入關(guān)鍵字。[INTO]是表名稱之前能夠包含的可選關(guān)鍵字。Table_name是相關(guān)的表名稱。column_list是列的集合,如果有多個(gè)列可用都好隔開。VALUES是相應(yīng)的列的值。如果需要向表mytables插入數(shù)據(jù),而mytables里包括自動增長的主鍵id和title兩列,則INSERT語句可以編寫為如下代碼。INSERTINTOmytablesVALUES<‘新的新聞標(biāo)題’>上述代碼向表mytables中插入了一條新記錄,并將title賦值為"新的新聞標(biāo)題"。值得注意的是,在這條語句中,并沒有編寫列的集合,是因?yàn)楫?dāng)不編寫column_list時(shí),則默認(rèn)為每一個(gè)列插入數(shù)值。注意:自動增長的主鍵類型的字段,無需向數(shù)據(jù)中插入數(shù)值,因?yàn)镾QLServer會自動為該列賦值。如果需要當(dāng)插入數(shù)據(jù)時(shí),需要指定插入相應(yīng)的列的值,則可以將SQL語句代碼編寫如下。INSERTINTOmytables<title>VALUES<‘新的新聞標(biāo)題’>上述代碼指定了列title,并對應(yīng)了相應(yīng)的值。若在表中存在多個(gè)列,列的順序和列相應(yīng)的值的順序必須匹配。例如有3列并分別為number1,string2,datetime3,當(dāng)需要向其中插入數(shù)據(jù)時(shí),則可以編寫以下SQL語句。INSERTINTOexamtable<number1,string2,datetime3>VALUES<1,’thisisastring’,’2008/9/18上述代碼編寫了INSERT語句以便數(shù)據(jù)的插入,同樣在插入語句中如果需要插入所有的列,可以簡化INSERT語句以便快速進(jìn)行數(shù)據(jù)插入,示例代碼如下所示。INSERTINTOexamtableVALUES<1,’thisisastring’,’2008/9/18值得注意的是,無論按照何種方法編寫SQL語句,值和列都應(yīng)該相互匹配。使用Command對象更新記錄編寫了SQL語句后,必須執(zhí)行SQL語句,在ADO.NET中,執(zhí)行SQL語句有很多方法,其中推薦使用Command命令的ExecuteNonQuery<>。執(zhí)行SQL語句的命令的必要步驟如下所示。打開數(shù)據(jù)連接。創(chuàng)建一個(gè)新的Command對象。定義一個(gè)SQL命令。執(zhí)行SQL命令。關(guān)閉連接。從上面的步驟可以發(fā)現(xiàn)執(zhí)行SQL語句是非常容易的,首先必須要打開到數(shù)據(jù)庫的連接,示例代碼如下所示。stringstr="server='<local>';database='mytable';uid='sa';pwd='sa'";SqlConnectioncon=newSqlConnection<str>; //創(chuàng)建連接對象con.Open<>; //打開連接其中,str是數(shù)據(jù)連接字串,用來初始化Connection對象,說明如何連接數(shù)據(jù)庫,當(dāng)數(shù)據(jù)庫連接完畢后,可以使用Open方法打開數(shù)據(jù)連接。完成數(shù)據(jù)庫連接后,需創(chuàng)建一個(gè)新的Command對象,示例代碼如下所示。SqlCommandcmd=newSqlCommand<"insertintomynewsvalue<'插入一條新數(shù)據(jù)'>",con>;Command對象的構(gòu)造函數(shù)的參數(shù)有兩個(gè),一個(gè)是需要執(zhí)行的SQL語句,令一個(gè)是數(shù)據(jù)庫連接對象。創(chuàng)建Command對象后,就可以執(zhí)行SQL命令,執(zhí)行后完成并關(guān)閉數(shù)據(jù)連接,示例代碼如下所示。cmd.ExecuteNonQuery<>; //執(zhí)行SQL命令con.Close<>; //關(guān)閉連接上述代碼使用了ExecuteNonQuery<>方法執(zhí)行了SELECT語句的操作,當(dāng)執(zhí)行完畢后就需要對現(xiàn)有的連接進(jìn)行關(guān)閉,以釋放系統(tǒng)資源。使用DataSet數(shù)據(jù)集插入記錄使用INSERT語句能夠完成數(shù)據(jù)插入,使用DataSet對象也可以完成數(shù)據(jù)插入。為了將數(shù)據(jù)庫的數(shù)據(jù)填充到DataSet中,則必須先使用DataAdapter對象的方法實(shí)現(xiàn)填充,當(dāng)數(shù)據(jù)填充完成后,開發(fā)人員可以將記錄添加到DataSet對象中,然后使用Update方法將記錄插入數(shù)據(jù)庫中。使用DataSet更新記錄的步驟如下所示:創(chuàng)建一個(gè)Connection對象。創(chuàng)建一個(gè)DataAdapter對象。初始化適配器。使用數(shù)據(jù)適配器的Fill方法執(zhí)行SELECT命令,并填充DataSet。使用DataTable對象提供的NewRow方法創(chuàng)建新行。將數(shù)據(jù)行的字段設(shè)置為插入的值。使用DataRowAdd類的Add方法將數(shù)據(jù)行添加到數(shù)據(jù)表中。把DataAdapter類的InsertCommand屬性設(shè)置成需要插入記錄的INSERT語句。使用數(shù)據(jù)適配器提供的Update方法將新記錄插入數(shù)據(jù)庫。使用DataSet類提供的AcceptChanges方法將數(shù)據(jù)庫與內(nèi)存中的數(shù)據(jù)保持一致。當(dāng)使用DataSet插入記錄前,需要創(chuàng)建Connection對象以保證數(shù)據(jù)庫連接,示例代碼如下所示。stringstr="server='<local>';database='mytable';uid='sa';pwd='sa'"; //創(chuàng)建連接字串SqlConnectioncon=newSqlConnection<str>; //創(chuàng)建連接對象con.Open<>; //打開連接上述代碼創(chuàng)建了一個(gè)數(shù)據(jù)庫連接,并打開了數(shù)據(jù)庫連接。完成數(shù)據(jù)連接后,就需要查詢表中的數(shù)據(jù)并使用DataAdapter對象初始化適配器,示例代碼如下所示。stringstrsql="select*frommynews"; //編寫SQL語句SqlDataAdapterda=newSqlDataAdapter<strsql,con>; //創(chuàng)建適配器DataAdapter對象默認(rèn)構(gòu)造函數(shù)包括兩個(gè)參數(shù),其中一個(gè)參數(shù)是需要執(zhí)行的SQL語句,另一個(gè)是Connection對象。在初始化適配器后,需要對適配器的相應(yīng)的屬性做設(shè)置,使用SqlCommandBuilder對象可以讓系統(tǒng)構(gòu)造InsertCommand屬性,示例代碼如下所示。SqlCommandBuilderbuild=newSqlCommandBuilder<da>; //構(gòu)造SQL語句使用適配器的Fill方法能夠填充DataSet數(shù)據(jù)集,示例代碼如下所示。DataSetds=newDataSet<>; //創(chuàng)建數(shù)據(jù)集da.Fill<ds,"datatable">; //填充數(shù)據(jù)集DataTabletb=ds.Tables["datatable"]; //創(chuàng)建表tb.PrimaryKey=newDataColumn[]{tb.Columns["id"]}; //創(chuàng)建表的主鍵上述代碼創(chuàng)建了一個(gè)DataSet數(shù)據(jù)集對象,被填充數(shù)據(jù)后,數(shù)據(jù)集中表的名稱被命名為datatable,該命名與數(shù)據(jù)庫中的表的名稱并不沖突。填充了DataSet數(shù)據(jù)對象后,需要使用DataRow對象為DataSet添加數(shù)據(jù),示例代碼如下所示。DataRowrow=ds.Tables["datatable"].NewRow<>; //創(chuàng)建DataRowrow["title"]="使用DataSet插入新行"; //賦值新列row["id"]="15";上述代碼使用了NewRow方法創(chuàng)建新行返回DataRow對象,當(dāng)DataRow對象中的相應(yīng)的元素被賦值后,則需要使用Rows.Add方法增加新行,因?yàn)橹粚ataRow對象賦值,并不能自動的在數(shù)據(jù)庫中增加新行。示例代碼如下所示。ds.Tables["datatable"].Rows.Add<row>; //添加新行上述代碼將數(shù)據(jù)更新到DataSet數(shù)據(jù)集中,為了保持?jǐn)?shù)據(jù)集中的數(shù)據(jù)和數(shù)據(jù)庫的數(shù)據(jù)的一致性,需使用Update方法,示例代碼如下所示。da.Update<ds,"datatable">; //更新數(shù)據(jù)當(dāng)執(zhí)行了Update方法后,數(shù)據(jù)庫中的數(shù)據(jù)就會同步DataSet數(shù)據(jù)集中的數(shù)據(jù)進(jìn)行數(shù)據(jù)更新。9.3ASP.NET更新數(shù)據(jù)庫在應(yīng)用程序的開發(fā)中,常常會需要對數(shù)據(jù)庫中現(xiàn)有的內(nèi)容進(jìn)行更新操作。ADO.NET提供了若干不同的更新數(shù)據(jù)庫中記錄的方法,如果需要更新數(shù)據(jù)庫中的某列的值或者某幾列的值,則需要使用SQLUPDATE命令進(jìn)行數(shù)據(jù)庫更新。SQLUPDATE數(shù)據(jù)更新語句使用SQLUPDATE語句能夠?qū)崿F(xiàn)數(shù)據(jù)庫中數(shù)據(jù)的更新,SQLUPDATE語句的一般語法格式如下所示。UPDATE{table_name}{SETcolumn1_name=expression1,column2_name=expression2,..columnN_name=expressionN{WHEREcondition1AND|ORcondition2}}上述代碼規(guī)范了UPDATE語句的編寫規(guī)范,其中:UPDATE是SQL更新關(guān)鍵字。table_name是需要更新的表的名稱。columnN_name是需要更新的列的名稱。expression是列相應(yīng)的值。WHERE是SQL語句關(guān)鍵字。condition是條件。如果需要更新表mytable中的某行的數(shù)據(jù),則可以編寫SQLUPDATE語句進(jìn)行更新,示例代碼如下所示。UPDATEmytableSETtitle=’修改后的數(shù)據(jù)’whereid=3上述代碼更新了id為3的數(shù)據(jù)中的title,并將title字段的值修改為"修改后的數(shù)據(jù)"。使用Command對象更新記錄如需要執(zhí)行UPDATE語句時(shí),同樣可以使用Command對象執(zhí)行語句。Command對象基本上能夠執(zhí)行所有需要進(jìn)行數(shù)據(jù)更新的SQL語句。使用Command對象進(jìn)行數(shù)據(jù)庫操作的步驟基本如下所示。創(chuàng)建數(shù)據(jù)庫連接。創(chuàng)建一個(gè)Command對象,并指定一個(gè)SQLUPDATE〔或存儲過程。使用Command對象的ExecuteNonQuery<>方法執(zhí)行UPDATE〔或存儲過程。關(guān)閉數(shù)據(jù)庫連接。當(dāng)需要執(zhí)行UPDATE語句時(shí),首先必須要打開到數(shù)據(jù)庫的連接,打開連接后,使用Command對象執(zhí)行SQL語句,示例代碼如下所示。stringstr="server='<local>';database='mytable';uid='sa';pwd='sa'";SqlConnectioncon=newSqlConnection<str>; //創(chuàng)建連接對象con.Open<>; //打開連接其中,str同樣是數(shù)據(jù)連接字串,用來初始化Connection對象,說明如何連接數(shù)據(jù)庫,當(dāng)數(shù)據(jù)庫連接完畢后,可以使用Open方法打開數(shù)據(jù)連接。完成數(shù)據(jù)庫連接后,需創(chuàng)建一個(gè)新的Command對象進(jìn)行數(shù)據(jù)更新,示例代碼如下所示。SqlCommandcmd=newSqlCommand<"UPDATEmynewsSETtitle=’修改后的數(shù)據(jù)’whereid=3",con>; //創(chuàng)建Command對象Command對象的構(gòu)造函數(shù)的參數(shù)有兩個(gè),一個(gè)是需要執(zhí)行的SQL語句,令一個(gè)是數(shù)據(jù)庫連接對象。創(chuàng)建Command對象后,就可以執(zhí)行SQL命令,執(zhí)行后完成并關(guān)閉數(shù)據(jù)連接,示例代碼如下所示。cmd.ExecuteNonQuery<>; //執(zhí)行SQL命令con.Close<>; //關(guān)閉連接上述代碼使用了ExecuteNonQuery<>方法進(jìn)行SQLUPDATE語句的執(zhí)行,從而能夠更新數(shù)據(jù)庫中的相應(yīng)數(shù)據(jù)。使用DataSet數(shù)據(jù)集更新記錄ADO.NET的DataSet對象提供了更好的編程實(shí)現(xiàn)數(shù)據(jù)庫的更新功能。因?yàn)镈ataSet對象與數(shù)據(jù)庫始終不是連接的,開發(fā)人員可以向脫離數(shù)據(jù)庫的DataSet對象中增加列、刪除列或更新列。當(dāng)完成了修改后,則可以通過將DataSet對象連接到DataAdapter對象來將記錄傳輸給數(shù)據(jù)庫。DataSet更新記錄的步驟如下所示。創(chuàng)建一個(gè)Connection對象。創(chuàng)建一個(gè)DataAdapter對象。初始化適配器。使用數(shù)據(jù)適配器的Fill方法執(zhí)行SELECT命令,并填充DataSet。執(zhí)行SqlCommandBuilder方法生成UpdataCommand方法。創(chuàng)建DataTable對象并指定相應(yīng)的DataSet中的表。創(chuàng)建DataRow對象并查找需要修改的相應(yīng)行。更改DataRow對象中的列的值。使用Update方法進(jìn)行數(shù)據(jù)更新。在更新記錄前,首先需要查詢出相應(yīng)的數(shù)據(jù),查詢相應(yīng)的數(shù)據(jù)后才能夠填充DataSet,示例代碼如下所示。stringstr="server='<local>';database='mytable';uid='sa';pwd='sa'"; //創(chuàng)建連接字串SqlConnectioncon=newSqlConnection<str>; //創(chuàng)建連接對象con.Open<>; //打開連接stringstrsql="select*frommynews"; //執(zhí)行查詢SqlDataAdapterda=newSqlDataAdapter<strsql,con>; //使用DataAdapterDataSetds=newDataSet<>; //使用DataSetda.Fill<ds,"datatable">; //使用Fill方法填充DataSet上述代碼將查詢出來的數(shù)據(jù)集保存在表為datatable的DataSet記錄集中,DataSet記錄集的表的名稱可以按照開發(fā)人員的喜好來編寫,從而區(qū)分內(nèi)存中表的數(shù)據(jù)和真實(shí)的數(shù)據(jù)庫的區(qū)別。當(dāng)需要處理數(shù)據(jù)時(shí),只需要處理相應(yīng)名稱的表即可,示例代碼如下所示。DataTabletb=ds.Tables["datatable"];當(dāng)需要執(zhí)行更新時(shí),可直接使用DataSet對象進(jìn)行更新操作來修改其中的一行或多行記錄,示例代碼如下所示。DataTabletb=ds.Tables["datatable"];tb.PrimaryKey=newDataColumn[]{tb.Columns["id"]};DataRowrow=tb.Rows.Find<1>;row["title"]="新標(biāo)題";當(dāng)需要更新某個(gè)記錄時(shí),必須在更新之前查找到該行的記錄。可以使用Rows.Find方法查找到相應(yīng)的行,然后將數(shù)據(jù)集表中的該行的列值進(jìn)行更新。使用DataAdapter的Update方法可以更新DataSet數(shù)據(jù)集,并保持?jǐn)?shù)據(jù)集和數(shù)據(jù)庫中數(shù)據(jù)的一致性,示例代碼如下所示。da.Update<ds,"datatable">;在執(zhí)行以上代碼,可能會拋出異常"當(dāng)傳遞具有已修改行的DataRow集合時(shí),更新要求有效的UpdateCommand"。這是因?yàn)樵诟聲r(shí),并沒有為DataAdapter對象配置UpdateCommand方法,可以通過SqlCommandBuilder對象配置UpdateCommand方法,示例代碼如下所示。SqlCommandBuilderbuild=newSqlCommandBuilder<da>;上述代碼為DataAdapter對象自動配置了UpdateCommand,DeleteCommand等方法,當(dāng)執(zhí)行更新時(shí),無需手動配置UpdateCommand方法。9.4ASP.NET刪除數(shù)據(jù)當(dāng)數(shù)據(jù)庫中的數(shù)據(jù)過多,或需要對數(shù)據(jù)庫進(jìn)行數(shù)據(jù)優(yōu)化時(shí),則可能需要對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行刪除,例如用戶的操作,長期不上線的用戶資料,都可以刪除。ADO.NET提供多種數(shù)據(jù)庫的刪除方法,并且同樣支持DataSet方法刪除數(shù)據(jù)庫。SQLDELETE數(shù)據(jù)刪除語句使用SQLDELETE語句能夠?qū)崿F(xiàn)數(shù)據(jù)庫中數(shù)據(jù)的更新,SQLDELETE語句的一般語法格式如下所示。DELETE[FROM]{table_name}[WHEREcondition1AND|ORcondition2]上述代碼規(guī)范了DELETE語句的編寫規(guī)范,其中:DELETE是SQL刪除關(guān)鍵字。FORM是一個(gè)可以選擇的關(guān)鍵字。table_name是表的名稱。WHERE是一個(gè)SQL關(guān)鍵字。conditionN是執(zhí)行DELETE命令中需要達(dá)成的若干條件。SQLDELETE相對來說比較簡單,當(dāng)需要對某個(gè)表中的數(shù)據(jù)進(jìn)行刪除時(shí),可以使用DELETE語句來執(zhí)行刪除操作,在編寫DELETE語句時(shí),需要指定表,并且指定相應(yīng)的條件,示例代碼如下所示。DELETEFROMmynewsWHEREID=3上述代碼指定刪除了mynews表中ID為3的行。如果不編寫WHERE子句,則該表中所有的行都能夠達(dá)成刪除的條件,則會刪除表中所有的行,示例代碼如下所示。DELETEFROMmynews在編寫刪除語句時(shí),可以通過編寫相應(yīng)的條件來提高執(zhí)行的效率。使用Command對象刪除記錄當(dāng)需要執(zhí)行刪除語句,可以使用Command對象來刪除數(shù)據(jù)庫中的記錄。Command對象的使用方法在前面的SQL語句介紹中已經(jīng)講的比較多了,在刪除記錄時(shí),其使用方法基本相同。使用Command對象進(jìn)行數(shù)據(jù)庫操作的步驟基本如下所示。創(chuàng)建數(shù)據(jù)庫連接。創(chuàng)建一個(gè)Command對象,并指定一個(gè)SQLDELETE〔或存儲過程。使用Command對象的ExecuteNonQuery<>方法執(zhí)行DELETE〔或存儲過程。關(guān)閉數(shù)據(jù)庫連接。當(dāng)需要執(zhí)行DELETE語句時(shí),首先必須要打開到數(shù)據(jù)庫的連接,打開連接后,使用Command對象執(zhí)行SQL語句,示例代碼如下所示。stringstr="server='<local>';database='mytable';uid='sa';pwd='sa'";SqlConnectioncon=newSqlConnection<str>;con.Open<>; //打開連接完成數(shù)據(jù)庫連接后,需創(chuàng)建一個(gè)新的Command對象,示例代碼如下所示。SqlCommandcmd=newSqlCommand<"Deletemynewswhereid=3",con>;Command對象的構(gòu)造函數(shù)的參數(shù)有兩個(gè),一個(gè)是需要執(zhí)行的SQL語句,令一個(gè)是數(shù)據(jù)庫連接對象。創(chuàng)建Command對象后,就可以執(zhí)行SQL命令,執(zhí)行后完成并關(guān)閉數(shù)據(jù)連接,示例代碼如下所示。cmd.ExecuteNonQuery<>; //執(zhí)行SQL命令con.Close<>; //關(guān)閉連接使用DataSet數(shù)據(jù)集刪除記錄使用DataSet刪除記錄和使用DataSet更新記錄非常的相似,DataSet刪除記錄的步驟如下所示。創(chuàng)建一個(gè)Connection對象。創(chuàng)建一個(gè)DataAdapter對象。初始化適配器。使用數(shù)據(jù)適配器的Fill方法執(zhí)行SELECT命令,并填充DataSet。執(zhí)行SqlCommandBuilder方法生成UpdataCommand方法。創(chuàng)建DataTable對象并指定相應(yīng)的DataSet中的表。創(chuàng)建DataRow對象并查找需要修改的相應(yīng)行。使用Delete方法刪除該行。使用Updata方法進(jìn)行數(shù)據(jù)更新。在刪除記錄前,首先需要創(chuàng)建連接,示例代碼如下所示。stringstr="server='<local>';database='mytable';uid='sa';pwd='sa'";SqlConnectioncon=newSqlConnection<str>;con.Open<>;stringstrsql="select*frommynews";上述代碼創(chuàng)建了與數(shù)據(jù)庫的連接,并編寫SQL查詢語句來填充DataSet。填充DataSet對象需使用DataAdapter,示例代碼如下所示。SqlDataAdapterda=newSqlDataAdapter<strsql,con>;SqlCommandBuilderbuild=newSqlCommandBuilder<da>;DataSetds=newDataSet<>;da.Fill<ds,"datatable">;編寫完成后,需要創(chuàng)建DataTable對象對DataSet中相應(yīng)的數(shù)據(jù)進(jìn)行操作,其代碼和更新記錄基本相同,示例代碼如下所示。DataTabletb=ds.Tables["datatable"];tb.PrimaryKey=newDataColumn[]{tb.Columns["id"]};DataRowrow=tb.Rows.Find<3>;在進(jìn)行刪除之前,同樣需要找到相應(yīng)的行,來指定刪除語句所需要刪除的行,示例代碼如下所示。row.Delete<>;讀者可以看到,DataSet刪除方法與更新方法不同的地方只操作語句的不同,在更新中使用的是Update<>方法,而在刪除中使用的是Delete<>方法。注意:當(dāng)使用Delete方法刪除記錄行的時(shí)候,可以通過調(diào)用DataRow對象的RejectChanges方法取消對記錄的刪除,當(dāng)使用該方法刪除記錄行時(shí),該行的狀態(tài)會恢復(fù)為Unchanged。在刪除完畢后,同樣需要保持DataSet中的數(shù)據(jù)和數(shù)據(jù)庫中的數(shù)據(jù)的一致性,示例代碼如下所示。da.Update<ds,"datatable">;使用Update方法能夠使DataSet中的數(shù)據(jù)和數(shù)據(jù)庫中的數(shù)據(jù)保持一致性,在ASP中,這種方法也比較常見。9.5使用存儲過程存儲過程在開發(fā)過程中經(jīng)常被使用,因?yàn)榇鎯^程能夠?qū)?shù)據(jù)操作和程序操作在代碼上分離,而且存儲過程相對于SQL語句而言,具有更好的性能和安全性,使用存儲過程能夠提高應(yīng)用程序的性能和安全性。存儲過程的優(yōu)點(diǎn)在數(shù)據(jù)庫操作中,已經(jīng)有了SQL語句,為何還需要存儲過程。因?yàn)榇鎯^程有SQL語句不能具備的特點(diǎn)和優(yōu)點(diǎn),以至于存儲過程能在嚴(yán)格的數(shù)據(jù)庫驅(qū)動的應(yīng)用程序中起到重要的作用。存儲和過程有點(diǎn)包括:事務(wù)處理。速度和性能。過程控制。安全性。減少網(wǎng)絡(luò)流量和通信。模塊化。1.事務(wù)處理存儲過程中,包括多個(gè)SQL語句,存儲過程中的SQL語句屬于事務(wù)處理的范疇。也就是說,存儲過程類似于一個(gè)函數(shù),當(dāng)執(zhí)行存儲過程時(shí),存儲過程中的SQL語句要不都執(zhí)行,要不都不執(zhí)行。2.速度和性能存儲過程由數(shù)據(jù)庫服務(wù)器編譯和優(yōu)化,優(yōu)化包括使用存儲過程在運(yùn)行時(shí)所必須的特定數(shù)據(jù)庫的結(jié)構(gòu)信息,這樣在執(zhí)行過程中會節(jié)約很多時(shí)間。存儲過程完全在數(shù)據(jù)庫服務(wù)器上執(zhí)行,避免了大量的SQL語句代碼的傳遞,對于循環(huán)使用SQL語句而言,存儲過程在速度和性能上都被優(yōu)化。3.過程控制在編寫存儲過程中,可以使用IFELSE、FOR以及WHILE循環(huán),這些語句并不能在SQL語句中編寫,但是可以在存儲過程中編寫。當(dāng)需要進(jìn)行大量的和復(fù)雜的操作時(shí),SQL語句需要通過和編程語言一同編寫才能實(shí)現(xiàn),而且實(shí)現(xiàn)復(fù)雜。相比之下,存儲過程可以對過程進(jìn)行控制。4.安全性存儲過程也可以作為額外的安全層。開發(fā)人員或者用戶,都只能對數(shù)據(jù)庫中的存儲過程進(jìn)行使用,而無法直接對表進(jìn)行數(shù)據(jù)操作,這樣封裝了數(shù)據(jù)操作,提高安全性。5.減少網(wǎng)絡(luò)流量和通信存儲過程是在數(shù)據(jù)庫服務(wù)器上運(yùn)行的,在使用存儲過程中,無需將大量的SQL語句代碼傳遞給數(shù)據(jù)庫服務(wù)器,而只需告訴數(shù)據(jù)庫服務(wù)器執(zhí)行哪個(gè)存儲過程即可,而數(shù)據(jù)庫服務(wù)器則會自行執(zhí)行中間處理操作,而不會通過網(wǎng)絡(luò)傳遞不必要的數(shù)據(jù)。6.模塊化正如代碼編寫規(guī)范和設(shè)計(jì)模式一樣,通常情況下,開發(fā)團(tuán)隊(duì)或者公司需要嚴(yán)謹(jǐn)?shù)拇a編寫風(fēng)格和良好的協(xié)調(diào)能力,例如一個(gè)團(tuán)隊(duì)有人專門負(fù)責(zé)編碼,有人專門負(fù)責(zé)數(shù)據(jù)庫開發(fā),那么可以讓數(shù)據(jù)庫開發(fā)人員負(fù)責(zé)數(shù)據(jù)庫的開發(fā),而編碼的程序員只需要使用數(shù)據(jù)庫開發(fā)人員設(shè)計(jì)的存儲過程即可。在這種情況下,數(shù)據(jù)庫操作和應(yīng)用程序編碼的操作被分開,在維護(hù)、管理中,也非常方便,如果數(shù)據(jù)庫存儲過程的代碼出現(xiàn)問題,則只需要修改存儲過程中的代碼即可。創(chuàng)建存儲過程存儲過程可以通過SQLServerManagementStudio創(chuàng)建,也可以使用.NET框架通過編程實(shí)現(xiàn).SQLServerManagementStudio創(chuàng)建存儲過程比較方便,右擊[對象資源管理器]中的相應(yīng)的數(shù)據(jù)庫,在下拉菜單中選擇[可編程性]選項(xiàng)并選擇[存儲過程]選項(xiàng)。單擊右鍵,選擇[新建存儲過程]選項(xiàng),系統(tǒng)會自動創(chuàng)建一個(gè)新的標(biāo)簽〔tab窗口,以提供輸入存儲過程語句,如圖9-3所示。圖9-3使用ServerManagementStudio創(chuàng)建存儲過程在tab窗口中輸入存儲過程,代碼如下所示。CREATEPROCmyproc<@idint,@titlevarchar<50>OUTPUT>ASSETNOCOUNTONDECLARE@newscountintSELECT@title=mynews.title,@newscount=COUNT<mynews.id>FROMmynewsWHERE<id=@id>GROUPBYmynews.titleRETURN@newscount上述存儲過程返回了數(shù)據(jù)庫中新聞的標(biāo)題內(nèi)容。"@id"表示新聞的id,@title表示新聞的標(biāo)題,此存儲過程將返回"@title"的值,并且返回新聞的總數(shù)。在C#中同樣可以使用編程實(shí)現(xiàn)存儲過程的創(chuàng)建,示例代碼如下所示。stringstr="CREATEPROCmyproc"+"<"+"@idint,"+"@titlevarchar<50>OUTPUT"+">"+"AS"+"SETNOCOUNTON"+"DECLARE@newscountint"+"SELECT@title=mynews.title,@newscount=COUNT<mynews.id>"+"FROMmynews"+"WHERE<id=@id>"+"GROUPBYmynews.title"+"RETURN@newscount";SqlCommandcmd=newSqlCommand<str,con>;cmd.ExecuteNonQuery<>; //使用cmd的ExecuteNonQuery方法創(chuàng)建存儲過程上述代碼通過使用SqlCommand對象的ExecuteNonQuery<>方法在數(shù)據(jù)庫中創(chuàng)建了一個(gè)存儲過程,該存儲過程用于返回了數(shù)據(jù)庫中新聞的標(biāo)題內(nèi)容。調(diào)用存儲過程創(chuàng)建存儲過程之后,可以在.NET應(yīng)用程序中使用存儲過程。存儲過程可以看成是一個(gè)函數(shù),可以對存儲過程進(jìn)行調(diào)用,傳遞參數(shù),接受返回值。在調(diào)用存儲過程前,首先要與數(shù)據(jù)庫建立連接,示例代碼如如下所示。stringstr="server='<local>';database='mytable';uid='sa';pwd='Sa'";SqlConnectioncon=newSqlConnection<str>;con.Open<>; //打開連接建立與數(shù)據(jù)庫連接后,需要使用Command對象使用存儲過程,Command對象接受的兩個(gè)參數(shù)分別為SQL語句和Connection對象,在使用存儲過程時(shí),其中表示SQL語句的參數(shù)可以直接編寫為存儲過程名,代碼如下所示。SqlCommandcmd=newSqlCommand<"getdetail",con>; //使用存儲過程默認(rèn)情況下,Command對象的類型是SQL語句,必須將Command對象的CommandType屬性設(shè)置為存儲過程,系統(tǒng)才會調(diào)用存儲過程,示例代碼如下所示。cmd.CommandType=CommandType.StoredProcedure; //設(shè)置Command對象的類型設(shè)置執(zhí)行類型后,需要為存儲過程增加參數(shù),示例代碼如下所示。SqlParameterspr; //表示執(zhí)行一個(gè)存儲過程spr=cmd.Parameters.Add<"@id",SqlDbType.Int>; //增加參數(shù)idspr=cmd.Parameters.Add<"@title",SqlDbType.NChar,50>; //增加參數(shù)titlespr.Direction=ParameterDirection.Output; //該參數(shù)是輸出參數(shù)spr=cmd.Parameters.Add<"@count",SqlDbType.Int>; //增加count參數(shù)spr.Direction=ParameterDirection.ReturnValue; //該參數(shù)是返回值cmd.Parameters["@id"].Value=1; //為參數(shù)初始化cmd.Parameters["@title"].Value=null; //為參數(shù)初始化參數(shù)設(shè)置完畢后,執(zhí)行ExecuteNonQuery方法能夠執(zhí)行存儲過程,就相當(dāng)于開始調(diào)用函數(shù),示例代碼如下所示。cmd.ExecuteNonQuery<>; //執(zhí)行存儲過程當(dāng)存儲過程執(zhí)行完畢后,能夠獲取參數(shù)和返回值,示例代碼如下所示。Label1.Text=cmd.Parameters["@count"].Value.ToString<>; //獲取返回值使用SQLServerManagementStudio同樣能夠執(zhí)行存儲過程,單擊存儲過程,單擊右鍵,選擇執(zhí)行存儲過程,系統(tǒng)會提示輸入?yún)?shù),如圖9-4所示。輸入相應(yīng)的參數(shù),單擊確定,系統(tǒng)會執(zhí)行存儲過程并返回相應(yīng)的值,如圖9-5所示。圖9-4為存儲過程傳遞參數(shù)圖9-5執(zhí)行完成使用SQLServerManagementStudio能夠快速的創(chuàng)建和使用存儲過程,同樣,能夠通過編程的方法實(shí)現(xiàn)存儲過程的創(chuàng)建、參數(shù)的傳遞以及執(zhí)行。存儲過程的優(yōu)點(diǎn)就在于速度比較快,能夠控制過程、減少網(wǎng)絡(luò)通信和模塊化,熟練的使用存儲過程能夠提高應(yīng)用程序的性能和復(fù)用性。9.6ASP.NET數(shù)據(jù)庫操作實(shí)例在了解了數(shù)據(jù)源控件和數(shù)據(jù)綁定控件的功能和使用方法,并且了解了ADO.NET的基本知識后,就可以使用控件和ADO.NET來操作數(shù)據(jù)庫。ASP.NET提供了強(qiáng)大的數(shù)據(jù)源控件和數(shù)據(jù)綁定控件,能夠迅速的對數(shù)據(jù)庫進(jìn)行操作,同時(shí),使用ADO.NET對數(shù)據(jù)進(jìn)行操作,能夠加深對ADO.NET的認(rèn)識。制作用戶界面〔UI使用數(shù)據(jù)控件和數(shù)據(jù)源控件顯式數(shù)據(jù),則需要為控件制作相應(yīng)的用戶界面,讓數(shù)據(jù)控件對用戶呈現(xiàn)的效果更好。首先,需要使用創(chuàng)建數(shù)據(jù)綁定控件GridView和數(shù)據(jù)源控件,并配置數(shù)據(jù)源控件,如圖9-6所示。顯然,對于用戶而言,該數(shù)據(jù)源控件和數(shù)據(jù)綁定控件顯然很不友好,這里就需要對數(shù)據(jù)綁定控件的界面進(jìn)行修改。通過配置數(shù)據(jù)綁定控件的相應(yīng)格式可以修改數(shù)據(jù)綁定控件的外觀,如圖9-7所示。圖9-6配置數(shù)據(jù)源控件和數(shù)據(jù)綁定控件圖9-7編輯數(shù)據(jù)綁定控件界面開發(fā)人員能夠自定義數(shù)據(jù)綁定控件的樣式,并且修改某些列的順序,這里使用了自動套用格式,并將數(shù)據(jù)綁定控件的width屬性設(shè)置為100%,這樣編寫寬度就能夠適應(yīng)瀏覽器的大小,從而隨著瀏覽器的大小而改變。數(shù)據(jù)綁定控件配置完成后,值得注意的是,需要勾選SQL語句的高級選項(xiàng),讓數(shù)據(jù)綁定控件支持編輯、刪除和選擇,如圖9-8所示。圖9-8SQL高級選項(xiàng)配置SQL高級選項(xiàng)后,數(shù)據(jù)源控件就會自動生成INSERT、UPDATE、DELETE語句,示例代碼如下所示。<asp:SqlDataSourceID="SqlDataSource1"runat="server"ConnectionString="<%$ConnectionStrings:mytableConnectionString%>"DeleteCommand="DELETEFROM[mynews]WHERE[ID]=@ID"InsertCommand="INSERTINTO[mynews]<[TITLE]>VALUES<@TITLE>"SelectCommand="SELECT*FROM[mynews]"UpdateCommand="UPDATE[mynews]SET[TITLE]=@TITLEWHERE[ID]=@ID"><DeleteParameters><asp:ParameterName="ID"Type="Int32"/></DeleteParameters><UpdateParameters><asp:ParameterName="TITLE"Type="String"/><asp:ParameterName="ID"Type="Int32"/></UpdateParameters><InsertParameters><asp:ParameterName="TITLE"Type="String"/></InsertParameters></asp:SqlDataSource>在完成用戶界面的配置后,系統(tǒng)生成的HTML代碼如下所示。<asp:GridViewID="GridView1"runat="server"AllowPaging="True"AutoGenerateColumns="False"BackColor="White"BorderColor="#E7E7FF"BorderStyle="None"BorderWidth="1px"CellPadding="3"DataKeyNames="ID"DataSourceID="SqlDataSource1"GridLines="Horizontal"Width="100%"><FooterStyleBackColor="#B5C7DE"ForeColor="#4A3C<RowStyleBackColor="#E7E7FF"ForeColor="#4A3C<Columns><asp:BoundFieldDataField="ID"HeaderText="ID"InsertVisible="False"ReadOnly="True"SortExpression="ID"/><asp:BoundFieldDataField="TITLE"HeaderText="TITLE"SortExpression="TITLE"/></Columns><PagerStyleBackColor="#E7E7FF"ForeColor="#4A3C<SelectedRowStyleBackColor="#738A9C"Font-Bold="True"ForeColor="#F7F<HeaderStyleBackColor="#4A3C8C"Font-Bold="True"ForeColor="#F<AlternatingRowStyleBackColor="#F7F7F</asp:GridView>開發(fā)人員可以編寫以上HTML實(shí)現(xiàn)更多的效果,當(dāng)確定用戶界面編寫完畢后,就可以為數(shù)據(jù)綁定控件選擇操作了。使用GridView顯示、刪除、修改數(shù)據(jù)配置完成用戶界面,則需要選擇GridView控件的屬性并配置GridView任務(wù),如圖9-9和圖9-10所示。圖9-9默認(rèn)GridView任務(wù)圖9-10選擇GridView任務(wù)GridView控件支持分頁、排序、編輯、刪除和選定內(nèi)容等操作。在GridView控件中,首先必須勾選[分頁]復(fù)選框,然后再配置PageSize屬性才能夠讓GridView控件支持分頁功能。在GridView控件屬性中如果勾選了[分頁]復(fù)選框而不配置PageSize屬性,則默認(rèn)按10條數(shù)據(jù)分頁。勾選了以啟用分頁、啟用編輯、啟用刪除和啟用選定內(nèi)容后,GridView控件的界面如圖9-11所示。因?yàn)樵跀?shù)據(jù)源控件配置的過程中,已經(jīng)配置了支持編輯、刪除和選擇,所以在數(shù)據(jù)綁定控件中可以選擇啟用編輯,啟用刪除和選定內(nèi)容等操作,并且系統(tǒng)默認(rèn)支持更新、插入、刪除等操作,運(yùn)行后如圖9-12所示。圖9-11編輯數(shù)據(jù)綁定控件界面圖9-12GridView控件顯式GridView控件支持編輯、刪除和選擇,當(dāng)單擊編輯時(shí),能夠?qū)x擇的行進(jìn)行數(shù)據(jù)編輯,如圖9-13所示。編輯完成后,單擊更新按鈕則可以執(zhí)行更新操作,而無需手動編寫UPDATE操作,如圖9-14所示。圖9-13編輯數(shù)據(jù)圖9-14執(zhí)行更新操作當(dāng)單擊刪除時(shí),則會執(zhí)行DELETE命令,而無需手動編寫DELETE命令。GridView控件支持分頁、排序、編輯、刪除和選定內(nèi)容,開發(fā)人員無需手動編寫更新、刪除、編輯、也無需手動編寫分頁,對GridView控件進(jìn)行緩存設(shè)置能夠提高應(yīng)用程序性能,在對數(shù)據(jù)庫的操作,編輯及更新中,GridView控件能夠方便開發(fā)人員,簡化代碼。使用DataList顯示數(shù)據(jù)DataList控件需要編輯HTML模板來顯式數(shù)據(jù),雖然在開發(fā)上,DataList控件比GridView更加復(fù)雜,但是DataList控件能夠?qū)崿F(xiàn)更多效果。相比之下,DataList控件比GridView控件更加靈活,能夠進(jìn)行復(fù)雜的事件編寫和樣式控制。選擇[自動套用格式]復(fù)選框并將DataList控件的寬度設(shè)置為100%,編輯基本的用戶界面,如圖9-15所示。通過編輯ItemTemplate能夠?qū)崿F(xiàn)自定義模板,而無需像GridView一樣,以表格形式呈現(xiàn),編輯后運(yùn)行如圖9-16所示。圖9-15DataList控件顯式數(shù)據(jù)圖9-16編寫ItemTemplate模板DataList控件執(zhí)行數(shù)據(jù)操作基本上同GridView一樣,DataList控件與GridView相比只下,有著更靈活的模板方案,能夠?qū)崿F(xiàn)更多的顯示效果。DataList分頁實(shí)現(xiàn)DataList控件本身并不帶分頁實(shí)現(xiàn),如果需要DataList能夠?qū)崿F(xiàn)分頁效果,則需要通過代碼實(shí)現(xiàn)DataList控件的分頁。DataList控件分頁需要增加若干標(biāo)簽〔Label控件來顯式"上一頁","下一頁"等分頁所需要的連接,示例代碼如下所示。<asp:LabelID="Label4"runat="server"Text="Label"></asp:Label><asp:LabelID="Label3"runat="server"Text="Label"></asp:Label><asp:LabelID="Label2"runat="server"Text="Label"></asp:Label>上述代碼創(chuàng)建了三個(gè)Label控件,這三個(gè)控件并無需初始化,這三個(gè)控件通過編程實(shí)現(xiàn)上一頁,下一頁的分頁形式。如果需要執(zhí)行分頁,則需要編寫cs頁面代碼,cs頁面代碼如下所示。PagedDataSourceobjPds=newPagedDataSource<>;objPds.DataSource=this.SqlDataSource1.Select<newDataSourceSelectArguments<>>;objPds.AllowPaging=true; //設(shè)置是否允許分頁objPds.PageSize=3; //設(shè)置分頁條目數(shù)intCurPage; //設(shè)置當(dāng)前頁碼Label2.Visible=false; //隱藏標(biāo)簽Label4.Visible=false;上述代碼初始化PagedDataSource對象,并將分頁控件默認(rèn)初始化屬性Visible為false。其中PagedDataSource是封裝分頁相關(guān)屬性的類。if<Request.QueryString["Page"]!=null> //如果傳遞的頁面不為空{(diào)CurPage=Convert.ToInt32<Request.Qu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論