




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、最新資料推薦243通過對ADO.NET的基本講解,以及講解了一些數據源控件的基本用法后,本章將介紹一些 ASP.NET操作數據庫的高級用法,包括使用 知識的一種補充和提升。第9章ASP.NET操作數據庫SQLHelper,以及數據源控件對數據的操作。本章是對前面的數據庫9.1使用ADO.NET操作數據庫上一章中介紹了 ADO.NET的基本概念、ADO.NET的對象,以及如何使用 ADO.NET。使用ADO.NET 能夠極大的方便開發人員對數據庫進行操作而無需關心數據庫底層之間的運行,ADO.NET不僅包括多個對象,同樣包括多種方法,這些方法都可以用來執行開發人員指定的SQL語句,但是這些方法實
2、現過程又不盡相同,本節將介紹ADO.NET中數據的操作方法。9.1.1使用ExecuteReader()操作數據庫使用 ExecuteReader()操作數 據庫,ExecuteReader()方 法 返回的 是一個 SqlDataReader對象或 OleDbDataReader對象。當使用 DataReader對象時,不會像 DataSet那樣提供無連接的數據庫副本, DataReader類被設計為產生只讀、只進的數據流。這些數據流都是從數據庫返回的。所以,每次的訪問 或操作只有一個記錄保存在服務器的內存中。相比與DataSet而言,DataReader具有較快的訪問能力,并且能夠使用較少
3、的服務器資源。DataReader 對象提供了“游標”形式的讀取方法,當從結果中讀取了一行,則“游標”會繼續讀取到下一行。通過 Read方法可以判斷數據是否還有下一行,如果存在數據,則繼續運行并返回true,否則返回false。示例代碼如下所示。/打開連接/SQL查詢語句/初始化Command對象/初始化DataReader對象string str = server=(local);database=mytable;uid=sa;pwd=sa; SqlConnection con = new SqlConnection(str);con.Open();string strsql = selec
4、t * from mynews;SqlCommand cmd = new SqlCommand(strsql, con); SqlDataReader rd = cmd.ExecuteReader();while (rd.Read()Response.Write(rdtitle.ToString();/通過索引獲取列DataReader可以提咼執行效率,有兩種方式可以提咼代碼的性能,一種是基于序號的查詢;第二種 情況則是使用適當的 Get方法來查詢。一般來說,在數據庫的設計中,需要設計索引鍵或主鍵來標識, 在主鍵的設計中,自動增長類型是經常使用的,自動增長類型通常為整型,所以基于序號的查詢可以
5、使 用DataReader,示例代碼如下所示。string str = server=(local);database=mytable;uid=sa;pwd=sa: SqlConnection con = new SqlConnection(str);con.Open();設置連接字串 /創建連接對象/打開連接最新資料推薦244/創建連接字串/創建連接對象/打開連接/創建執行SQL語句/創建Command對象/創建DataReader對象int id = rd.GetOrdinal(title);while (rd.Read()/輸岀對象的值string strsql = select * f
6、rom mynews where id=1 order by id desc;/ 按標識查詢SqlCommand cmd = new SqlCommand(strsql, con);/倉U建 Command 對象SqlDataReader rd = cmd.ExecuteReader();/創建 DataReader對象while (rd.Read()/ 遍歷數據庫Response.Write(rdtitle.ToString();/ 讀取相應行的信息當使用ExecuteReader()操作數據庫時,會遇到知道某列的名稱而不知道某列的號的情況,這種情況 可以通過使用DataReader對象的G
7、etOrdinal()方法獲取相應的列號。此方法接收一個列名并返回此列名所在的列號,示例代碼如下所示。string str = server=(local);database=mytable;uid=sa;pwd=sa: SqlConnection con = new SqlConnection(str);con.Open();string strsql = select * from mynews where id=1 order by id desc;SqlCommand cmd = new SqlCommand(strsql, con);SqlDataReader rd = cmd.Ex
8、ecuteReader();/使用GetOrdinal方法獲取title列的列號/遍歷DataReader對象Labell.Text =新聞 id 是+ rdid;當完成數據庫操作時,需要關閉數據庫連接,DataReader對象在調用Close()方法即關閉與數據庫的連接,如果在沒有關閉之前又打開另一個連接,系統會拋出異常。示例代碼如下所示。rd.Close();/關閉 DataReader 對象ExecuteReader()可以執行相應的 SQL語句,例如插入、更新以及刪除等,當需要執行插入、更新或 刪除時,可以使用 ExecuteReader()進行數據操作,示例代碼如下所示。/創建連接字
9、串/創建連接對象/打開連接/創建執行SQL語句/創建Command對象/使用 ExcuteReader()方法/讀取數據庫string str = server=(local);database=mytable;uid=sa;pwd=sa;SqlConnection con = new SqlConnection(str); con.Open();string strsql = insert into mynews values (執行更新后的標題 );SqlCommand cmd = new SqlCommand(strsql, con);SqlDataReader rd = cmd.Exe
10、cuteReader();while (rd.Read()Response.Write(rdtitle.ToString() + );rd.Close();Response.Redirect(ExecuteReader.aspx);/關閉DataReader對象當執行了插入、刪除等數據庫操作時,ExecuteReader返回為空的DataReader對象。當使用 Read方法遍歷讀取數據庫時,并不會顯示相應的數據信息,因為不是查詢語句,則返回一個沒有任何數據的System.Data.OleDb.OleDbDataReader 類型的集(EOF),但是 ExecuteReader 方法可以執行
11、SQL 語句。 如圖9-1所示。最新資料推薦245/創建連接字串/創建連接對象/打開連接/編寫執行刪除的SQL語句/創建Command對象/返回影響行數使用ExecuteReader(臊作數據庫,通常情況下是使用ExecuteReader()進行數據庫查詢操作,使用ExecuteReader()查詢數據庫能夠提升查詢效率,而如果需要進行數據庫事務處理的話,ExecuteReader()方法并不是理想的選擇。9.1.2使用 ExecuteNonQuery()操作數據庫使用ExecuteNonQuery()操作數據庫時,ExecuteNonQuery()并不返回 DataReader對象,返回的是
12、個整型的值,代表執行某個SQL語句后,在數據庫中影響的行數,示例代碼如下所示。string str = server=(local);database=mytable;uid=sa;pwd=sa;/創建連接字串SqlConnection con = new SqlConnection(str);/創建連接對象con.Open();/打開連接string strsql = select top 5 * from mynews order by id desc;SqlCommand cmd = new SqlCommand(strsql, con);/使用 ExecuteNonQueryLabel
13、1.Text=該操作影響了 +cmd.ExecuteNonQuery()+行;/執行SQL語句并返回行上述代碼使用了 SELECT語句,并執行語句,返回受影響的行數。運行后,發現返回的結果為-1,說明,當使用SELECT語句時,并沒有對任何行有任何影響。ExecuteNonQuery()通常情況下為數據庫事務處理的首選,當需要執行插入、刪除、更新等操作時,首選ExecuteNonQuery()。對于更新、插入和刪除的SQL句,ExecuteNonQuery()方法的返回值為該命令所影響的行數。對于“CREATE TABLE ”和“DROP TABLE ”語句,返回值為0,而對于所有其他類型的語
14、句,返回值為-1。ExecuteNonQuery()操作數據時,可以不使用DataSet直接更改數據庫中的數據,示例代碼如下所示。protected void Button1_Click(object sender, EventArgs e) string str = server=(local);database=mytable;uid=sa;pwd=sa: SqlConnection con = new SqlConnection(str);con.Open();string strsql = delete from mynews where id4;SqlCommand cmd = ne
15、w SqlCommand(strsql, con);Label1.Text =該操作影響了 + cmd.ExecuteNonQuery() + 行;圖9-1 ExecuteReader()執行查詢和事務處理最新資料推薦246運行上述代碼后,會執行刪除id號大于4的數據事務,當執行刪除并刪除完畢后,則ExecuteNonQuery()方法返回受影響的行數,如圖 9-2所示。圖 9-2 ExecuteNonQuery()方法ExecuteNo nQuery()操作主要進行數據庫操作,包括更新、插入和刪除等操作,并返回相應的行數。在進行數據庫事務處理時或不需要DataSet為數據庫進行更新時,Exe
16、cuteNonQuery()方法是數據操作的首選。因為ExecuteNonQuery()支持多種數據庫語句的執行。注意:有些項目中,通過判斷ExecuteNonQuery()的返回值來判斷 SQL語句是否執行成功,這樣是有失偏頗的,因為當使用創建表的語句時,就算執行成功也會返回-1。9.1.3使用ExecuteScalar()操作數據庫ExecuteScalar()方法也用來執行SQL語句,但是 ExecuteScalar()執行 SQL語句后的返回值與ExecuteNonQuery()并不相同,ExecuteScalar()方法的返回值的數據類型是Object類型。如果執行的 SQL語句是一
17、個查詢語句(SELECT),則返回結果是查詢后的第一行的第一列,如果執行的SQL語句不是一個查詢語句,則會返回一個未實例化的對象,必須通過類型轉換來顯示,示例代碼如下所示。string str = server=(local);database=mytable;uid=sa;pwd=sa:/創建連接字串SqlConnection con = new SqlConnection(str);/創建連接對象con.Open();/打開連接string strsql = select * from mynews order by id desc;SqlCommand cmd = new SqlComm
18、and(strsql, con);Labell.Text =查詢出了 Id 為+ cmd.ExecuteScalar() ;/使用 ExecuteScalar 查詢通常情況下ExecuteNonQuery()操作后返回的是一個值,而ExecuteScalar()操作后則會返回一個對象, ExecuteScalar()經常使用于當需要返回單一值時的情況。例如當插入一條數據信息時,常常需要馬上知 道剛才插入的值,則可以使用ExecuteScalar()方法。示例代碼如下所示。string str = server=(local);database=mytable;uid=sa;pwd=sa;/創建
19、連接字串SqlConnection con = new SqlConnection(str);II創建連接對象con.Open();/打開連接string strsql = insert into mynews values (剛剛插入的 id 是多少?)SELECT IDENTITYas bh;II插入語句SqlCommand cmd = new SqlCommand(strsql, con);II執行語句Labell.Text =剛剛插入的行的 id 是+ cmd.ExecuteScalar();II返回賦值上述代碼使用了SELECT IDENTITY 語法獲取剛剛執行更新后的id值,然后
20、通過使用ExecuteScalar()方法來獲取剛剛更新后第一行第一列的值。9.1.4使用 ExecuteXmlReader()操作數據庫ExecuteXmlReader()方法用于操作 XML 數據庫,并返回一個XmlReader對象,若需要使用最新資料推薦247ExecuteXmlReader()方法,則必須添加引用System.Xml。XmlReader類似于 DataReader,都需要通過Comma nd對象的ExecuteXmlReader()方法來創建 XmlReader的對象并初始化,示例代碼如下所示。XmlReader xdr = cmd.ExecuteXmlReader()
21、;/創建 XmlReader 對象ExecuteXmlReader()返回 XmlReader 對象,XmlReader 特性如下所示:XMLReader是面向流的,它把 XML文檔看作是文本數據流。XMLReader是一個抽象類。XMLReader使用pull模式處理流。三個派生類:XMLTextReader、XMLNodeReader 和 XMLValidatingReader卜面代碼實現了獲取當前節點中屬性的個數。string str = server=(local);database=mytable;uid=sa;pwd=sa;/創建連接字串SqlConnection con = ne
22、w SqlConnection(str);/創建連接對象con.Open();/打開連接string strsql = select * from mynews order by id desc FOR XML AUTO, XMLDATA;SqlCommand cmd = new SqlCommand(strsql, con);/創建 Command對象XmlReader xdr = cmd.ExecuteXmlReader();/創建 XmlReader 對象Response.Write(xdr.AttributeCount);/讀取節點個數上述代碼使用了 SQL語言中的 FOR XML A
23、UTO,、XMLDATA 關鍵字,當執行ExecuteXmlReader() 方法時,會返回XmlReader對象,若不指定FOR XML AUTO,、XMLDATA 關鍵字,則系統會拋出異常。9.2ASP.NET創建和插入記錄在數據庫操作中,經常需要對數據庫中的內容進行插入操作。例如當有一個用戶發布了評論,或者 一個用戶要購買某個商品,都需要插入記錄來保存用戶的相應的信息,以便當用戶再次登錄網站或應用 時,能夠及時獲取自己購買的信息。9.2.1SQL INSERT數據插入語句使用SQL INSERT語句能夠實現數據庫的插入,SQL語句必須遵照一些規范,SQL INSERT語句的一般語法形式如
24、下所示:INSERT INTO table_name (colum nist) VALUES(DEFAULT|NULL|expression,n) 上述代碼規范了 INSERT語句的編寫規范,其中:INSERT是SQL插入關鍵字。INTO是表名稱之前能夠包含的可選關鍵字。Table_name是相關的表名稱。column_list是列的集合,如果有多個列可用都好隔開。 VALUES是相應的列的值。如果需要向表 mytables插入數據,而 mytables里包括自動增長的主鍵id和title兩列,貝U INSERT語句可以編寫為如下代碼。INSERT INTO mytables VALUES (
25、新的新聞標題上述代碼向表 mytables中插入了一條新記錄,并將 title賦值為新的新聞標題”。值得注意的是, 最新資料推薦248在這條語句中,并沒有編寫列的集合,是因為當不編寫column_list時,則默認為每一個列插入數值。注意:自動增長的主鍵類型的字段,無需向數據中插入數值,因為SQL Server會自動為該列賦值。如果需要當插入數據時,需要指定插入相應的列的值,則可以將SQL語句代碼編寫如下。INSERT INTO mytables (title) VALUES ( 新的新聞標題上述代碼指定了列title,并對應了相應的值。若在表中存在多個列,列的順序和列相應的值的順序 必須匹配
26、。例如有3列并分別為number1, string2 , datetime3,當需要向其中插入數據時,則可以編寫以下SQL語句。INSERT INTO examtable (number1,string2,datetime3) VALUES (1,this is a string 2008/9/18 上述代碼編寫了 INSERT語句以便數據的插入,同樣在插入語句中如果需要插入所有的列,可以簡 化INSERT語句以便快速進行數據插入,示例代碼如下所示。INSERT INTO examtable VALUES (1,this is a string ,2008/9/18 值得注意的是,無論按照何種
27、方法編寫SQL語句,值和列都應該相互匹配。9.2.2使用Comma nd對象更新記錄編寫了 SQL語句后,必須執行 SQL語句,在ADO.NET中,執行SQL語句有很多方法,其中推薦 使用Comma nd命令的ExecuteNo nQuery()。執行SQL語句的命令的必要步驟如下所示。打開數據連接。創建一個新的Comma nd對象。定義一個SQL命令。執行SQL命令。 關閉連接。從上面的步驟可以發現執行SQL語句是非常容易的,首先必須要打開到數據庫的連接,示例代碼如下所示。string str = server=(local);database=mytable;uid=sa;pwd=sa:S
28、qlConnection con = new SqlConnection(str);/ 創建連接對象con.Open();/ 打開連接其中,str是數據連接字串,用來初始化Connection對象,說明如何連接數據庫,當數據庫連接完畢后,可以使用Ope n方法打開數據連接。完成數據庫連接后,需創建一個新的Comma nd對象,示例代碼如下所示。SqlCommand cmd = new SqlCommand(insert into mynews value (插入一條新數據 ), con);Comma nd對象的構造函數的參數有兩個,一個是需要執行的 SQL語句,令一個是數據庫連接對象。創建Co
29、mma nd對象后,就可以執行 SQL命令,執行后完成并關閉數據連接,示例代碼如下所示。cmd.ExecuteNonQuery(); con.Close();/執行SQL命令/關閉連接上述代碼使用了ExecuteNonQuery()方法執行了SELECT語句的操作,當執行完畢后就需要對現有的連接進行關閉,以釋放系統資源。9.2.3使用DataSet數據集插入記錄使用INSERT語句能夠完成數據插入,使用DataSet對象也可以完成數據插入。為了將數據庫的數據填充到DataSet中,則必須先使用 DataAdapter對象的方法實現填充,當數據填充完成后,開發人員可以將記錄添加到 DataSet
30、對象中,然后使用 Update方法將記錄插入數據庫中。使用DataSet更新記錄的最新資料推薦249步驟如下所示:創建一個Connection對象。創建一個DataAdapter對象。初始化適配器。使用數據適配器的 Fill方法執行SELECT命令,并填充DataSet。使用DataTable對象提供的NewRow方法創建新行。將數據行的字段設置為插入的值。使用DataRowAdd類的Add方法將數據行添加到數據表中。把DataAdapter類的InsertCommand屬性設置成需要插入記錄的INSERT語句。使用數據適配器提供的Update方法將新記錄插入數據庫。使用DataSet類提供的
31、AcceptChanges方法將數據庫與內存中的數據保持一致。當使用DataSet插入記錄前,需要創建Conn ection對象以保證數據庫連接,示例代碼如下所示。string str = server=(local);database=mytable;uid=sa;pwd=sa;倉 U 建連接字串SqlConnection con = new SqlConnection(str);倉 U 建連接對象con.Open();打開連接上述代碼創建了一個數據庫連接,并打開了數據庫連接。完成數據連接后,就需要查詢表中的數據并使用DataAdapter對象初始化適配器,示例代碼如下所示。string s
32、trsql = select * from mynews;SqlDataAdapter da = new SqlDataAdapter(strsql, con);編寫SQL語句創建適配器DataAdapter對象默認構造函數包括兩個參數,其中一個參數是需要執行的 Conn ection對象。在初始化適配器后,需要對適配器的相應的屬性做設置,使用 象可以讓系統構造 InsertCommand屬性,示例代碼如下所示。SQL語句,另一個是SqlCommandBuilder 對SqlCommandBuilder build = new SqlCommandBuilder(da);構造SQL語句使用適配
33、器的Fill方法能夠填充 DataSet數據集,示例代碼如下所示。DataSet ds = new DataSet();da.Fill(ds, datatable);DataTable tb = ds.Tablesdatatable;tb.PrimaryKey = new DataColum n tb.Columnsid ;創建數據集 填充數據集 創建表創建表的主鍵上述代碼創建了一個DataSet數據集對象,被填充數據后,數據集中表的名稱被命名為datatable,該命名與數據庫中的表的名稱并不沖突。填充了 DataSet數據對象后,需要使用DataRow對象為DataSet添加數據,示例代碼
34、如下所示。DataRow row = ds.Tablesdatatable.NewRow(); rowtitle=使用 DataSet 插入新行;rowid = 15;倉U建 DataRow賦值新列上述代碼使用了 NewRow方法創建新行返回 DataRow對象,當DataRow對象中的相應的兀素被賦值后,則需要使用 Rows.Add方法增加新行,因為只對DataRow對象賦值,并不能自動的在數據庫中增加新行。示例代碼如下所示。ds.Tablesdatatable.Rows.Add(row);添加新行上述代碼將數據更新到DataSet數據集中,為了保持數據集中的數據和數據庫的數據的一致性,需使
35、用Update方法,示例代碼如下所示。da.Update(ds, datatable);更新數據當執行了 Update方法后,數據庫中的數據就會同步DataSet數據集中的數據進行數據更新。最新資料推薦2509.3ASP.NET更新數據庫在應用程序的開發中,常常會需要對數據庫中現有的內容進行更新操作。ADO.NET提供了若干不同的更新數據庫中記錄的方法,如果需要更新數據庫中的某列的值或者某幾列的值,則需要使用SQLUPDATE命令進行數據庫更新。9.3.1SQL UPDATE 數據更新語句使用SQL UPDATE語句能夠實現數據庫中數據的更新,SQL UPDATE語句的一般語法格式如下所示。U
36、PDATEtable_nameSET column1_name=expression1,column2_name=expression2,columnN_name=expressionNWHERE condition1 AND|OR condition2上述代碼規范了 UPDATE語句的編寫規范,其中:UPDATE是SQL更新關鍵字。table_name是需要更新的表的名稱。columnN_name是需要更新的列的名稱。expression是列相應的值。WHERE是SQL語句關鍵字。condition 是條件。如果需要更新表 mytable中的某行的數據,則可以編寫SQL UPDATE語句進行
37、更新,示例代碼如下 所示。UPDATE mytable SET title= 修改后的數據where id=3上述代碼更新了 id為3的數據中的title,并將title字段的值修改為修改后的數據”。9.3.2使用Comma nd對象更新記錄如需要執行 UPDATE語句時,同樣可以使用 Comma nd對象執行語句。Comma nd對象基本上能夠 執行所有需要進行數據更新的SQL語句。使用Comma nd對象進行數據庫操作的步驟基本如下所示。創建數據庫連接。創建一個Comma nd對象,并指定一個 SQL UPDATE (或存儲過程)。使用Comma nd對象的ExecuteNo nQuery
38、()方法執行UPDATE (或存儲過程)。 關閉數據庫連接。當需要執行UPDATE語句時,首先必須要打開到數據庫的連接,打開連接后,使用Comma nd對象執行SQL語句,示例代碼如下所示。string str = server=(local);database=mytable;uid=sa;pwd=sa: SqlConnection con = new SqlConnection(str);/ 創建連接對象con.Open();/ 打開連接最新資料推薦251其中,str同樣是數據連接字串,用來初始化Conn ection對象,說明如何連接數據庫,當數據庫連接完畢后,可以使用Ope n方法打開
39、數據連接。完成數據庫連接后,需創建一個新的Comma nd對象進行數據更新,示例代碼如下所示。SqlCommand cmd = new SqlCommand(UPDATE mynews SET title=修改后的數據where id=3, con);/創建 Command 對象Comma nd對象的構造函數的參數有兩個,一個是需要執行的 SQL語句,令一個是數據庫連接對象。創建Comma nd對象后,就可以執行SQL命令,執行后完成并關閉數據連接,示例代碼如下所示。cmd.ExecuteNonQuery();/執行SQL命令con.Close();/關閉連接上述代碼使用了 ExecuteNo
40、nQuery()方法進行SQL UPDATE語句的執行,從而能夠更新數據庫中的 相應數據。9.3.3使用DataSet數據集更新記錄ADO.NET的DataSet對象提供了更好的編程實現數據庫的更新功能。因為DataSet對象與數據庫始終不是連接的,開發人員可以向脫離數據庫的DataSet對象中增加列、刪除列或更新列。當完成了修改后,則可以通過將 DataSet對象連接到 DataAdapter對象來將記錄傳輸給數據庫。DataSet更新記錄的步驟如下所示。創建一個Connection對象。創建一個DataAdapter對象。初始化適配器。使用數據適配器的 Fill方法執行SELECT命令,并
41、填充DataSet。執行 SqlCommandBuilder 方法生成 UpdataCommand 方法。創建DataTable對象并指定相應的 DataSet中的表。創建DataRow對象并查找需要修改的相應行。更改DataRow對象中的列的值。使用Update方法進行數據更新。在更新記錄前,首先需要查詢出相應的數據,查詢相應的數據后才能夠填充DataSet,示例代碼如下所示。string str = server=(local);database=mytable;uid=sa;pwd=sa;/創建連接字串SqlConnection con = new SqlConnection(str);
42、/創建連接對象con.Open();/打開連接string strsql = select * from mynews;/執行查詢SqlDataAdapter da = new SqlDataAdapter(strsql, con);/使用 DataAdapterDataSet ds = new DataSet();/使用 DataSetda.Fill(ds, datatable);/使用Fill方法填充DataSet上述代碼將查詢出來的數據集保存在表為datatable的DataSet記錄集中,DataSet記錄集的表的名稱可以按照開發人員的喜好來編寫, 從而區分內存中表的數據和真實的數據庫
43、的區別。當需要處理數據時,只需要處理相應名稱的表即可,示例代碼如下所示。DataTable tb = ds.Tablesdatatable;當需要執行更新時,可直接使用DataSet對象進行更新操作來修改其中的一行或多行記錄,示例代碼如下所示。DataTable tb = ds.Tablesdatatable; tb.PrimaryKey = new DataColum n tb.Columnsid ; DataRow row = tb.Rows.Find(l);rowtitle=新標題;最新資料推薦252當需要更新某個記錄時,必須在更新之前查找到該行的記錄。可以使用Rows.Find方法查找
44、到相應的行,然后將數據集表中的該行的列值進行更新。使用DataAdapter的Update方法可以更新 DataSet數據集,并保持數據集和數據庫中數據的一致性,示例代碼如下所示。da.Update(ds, datatable);在執行以上代碼,可能會拋出異常“當傳遞具有已修改行的DataRow集合時,更新要求有效的UpdateCommand”。這是因為在更新時,并沒有為DataAdapter對象配置 UpdateCommand方法,可以通過SqlCommandBuilder對象配置 UpdateCommand方法,示例代碼如下所示。SqlCommandBuilder build = new
45、SqlCommandBuilder(da);上述代碼為 DataAdapter對象自動配置了 UpdateCommand , DeleteCommand等方法,當執行更新時, 無需手動配置 UpdateCommand方法。9.4ASP.NET刪除數據當數據庫中的數據過多, 或需要對數據庫進行數據優化時, 則可能需要對數據庫中的數據進行刪除, 例如用戶的操作,長期不上線的用戶資料,都可以刪除。ADO.NET提供多種數據庫的刪除方法,并且同樣支持DataSet方法刪除數據庫。9.4.1SQL DELETE數據刪除語句使用SQL DELETE語句能夠實現數據庫中數據的更新,SQL DELETE語句的
46、一般語法格式如下所示。DELETE FROMtable_nameWHERE condition1 AND|OR condition2上述代碼規范了 DELETE語句的編寫規范,其中:DELETE是SQL刪除關鍵字。FORM是一個可以選擇的關鍵字。table_name是表的名稱。 WHERE是一個SQL關鍵字。 conditionN是執行DELETE命令中需要達成的若干條件。SQL DELETE相對來說比較簡單,當需要對某個表中的數據進行刪除時,可以使用DELETE語句來執行刪除操作,在編寫DELETE語句時,需要指定表,并且指定相應的條件,示例代碼如下所示。DELETE FROM mynews
47、 WHERE ID=3上述代碼指定刪除了 my news表中ID為3的行。如果不編寫WHERE子句,則該表中所有的行都能夠達成刪除的條件,則會刪除表中所有的行,示例代碼如下所示。DELETE FROM mynews在編寫刪除語句時,可以通過編寫相應的條件來提高執行的效率。942 使用Comma nd對象刪除記錄當需要執行刪除語句,可以使用Comma nd對象來刪除數據庫中的記錄。Comma nd對象的使用方法在前面的SQL語句介紹中已經講的比較多了,在刪除記錄時,其使用方法基本相同。使用Comma nd對象進行數據庫操作的步驟基本如下所示。最新資料推薦253創建數據庫連接。創建一個Comma
48、nd對象,并指定一個 SQL DELETE (或存儲過程)。使用Comma nd對象的ExecuteNo nQuery()方法執行 DELETE (或存儲過程)。 關閉數據庫連接。當需要執行DELETE語句時,首先必須要打開到數據庫的連接,打開連接后,使用Comma nd對象執行SQL語句,示例代碼如下所示。string str = server=(local);database=mytable;uid=sa;pwd=sa: SqlConnection con = new SqlConnection(str);con.Open();/ 打開連接完成數據庫連接后,需創建一個新的Comma nd對
49、象,示例代碼如下所示。SqlCommand cmd = new SqlCommand(Delete mynews where id=3, con);Comma nd對象的構造函數的參數有兩個,一個是需要執行的 SQL語句,令一個是數據庫連接對象。創建Comma nd對象后,就可以執行 SQL命令,執行后完成并關閉數據連接,示例代碼如下所示。cmd.ExecuteNonQuery();/執行SQL命令con.Close();/關閉連接943使用DataSet數據集刪除記錄使用DataSet刪除記錄和使用 DataSet更新記錄非常的相似,DataSet刪除記錄的步驟如下所示。創建一個Connec
50、tion對象。創建一個DataAdapter對象。初始化適配器。使用數據適配器的 Fill方法執行SELECT命令,并填充DataSet。執行 SqlCommandBuilder 方法生成 UpdataCommand 方法。創建DataTable對象并指定相應的 DataSet中的表。創建DataRow對象并查找需要修改的相應行。使用Delete方法刪除該行。使用Updata方法進行數據更新。在刪除記錄前,首先需要創建連接,示例代碼如下所示。string str = server=(local);database=mytable;uid=sa;pwd=sa;SqlConnection con
51、= new SqlConnection(str);con.Open();string strsql = select * from mynews;上述代碼創建了與數據庫的連接,并編寫 SQL查詢語句來填充DataSet。填充DataSet對象需使用DataAdapter,示例代碼如下所示。SqlDataAdapter da = new SqlDataAdapter(strsql, con);SqlCommandBuilder build = new SqlCommandBuilder(da);DataSet ds = new DataSet();da.Fill(ds, datatable);編
52、寫完成后,需要創建DataTable對象對DataSet中相應的數據進行操作,其代碼和更新記錄基本相同,示例代碼如下所示。DataTable tb = ds.Tablesdatatable;tb.PrimaryKey = new DataColum n tb.Columnsid ;DataRow row = tb.Rows.Find(3);在進行刪除之前,同樣需要找到相應的行,來指定刪除語句所需要刪除的行,示例代碼如下所示。row.Delete();最新資料推薦254讀者可以看到,DataSet刪除方法與更新方法不同的地方只操作語句的不同,在更新中使用的是Update()方法,而在刪除中使用的
53、是Delete()方法。注意:當使用 Delete方法刪除記錄行的時候,可以通過調用DataRow對象的RejectChanges方法取消對記錄的刪除,當使用該方法刪除記錄行時,該行的狀態會恢復為Un cha nged。在刪除完畢后,同樣需要保持DataSet中的數據和數據庫中的數據的一致性,示例代碼如下所示。da.Update(ds, datatable);使用Update方法能夠使DataSet中的數據和數據庫中的數據保持一致性,在ASP中,這種方法也比較常見。9.5使用存儲過程存儲過程在開發過程中經常被使用,因為存儲過程能夠將數據操作和程序操作在代碼上分離,而且 存儲過程相對于 SQL語
54、句而言,具有更好的性能和安全性,使用存儲過程能夠提高應用程序的性能和 安全性。9.5.1存儲過程的優點在數據庫操作中,已經有了SQL語句,為何還需要存儲過程。因為存儲過程有SQL語句不能具備的特點和優點,以至于存儲過程能在嚴格的數據庫驅動的應用程序中起到重要的作用。存儲和過程有點 包括:事務處理。速度和性能。過程控制。安全性。減少網絡流量和通信。模塊化。1 1事務處理存儲過程中,包括多個 SQL語句,存儲過程中的 SQL語句屬于事務處理的范疇。也就是說,存儲 過程類似于一個函數,當執行存儲過程時,存儲過程中的SQL語句要不都執行,要不都不執行。2 2速度和性能存儲過程由數據庫服務器編譯和優化,
55、 優化包括使用存儲過程在運行時所必須的特定數據庫的結構 信息,這樣在執行過程中會節約很多時間。存儲過程完全在數據庫服務器上執行,避免了大量的 SQL 語句代碼的傳遞,對于循環使用 SQL 語句而言,存儲過程在速度和性能上都被優化。3 3過程控制在編寫存儲過程中,可以使用IF ELSE、FOR以及WHILE循環,這些語句并不能在 SQL語句中編寫,但是可以在存儲過程中編寫。當需要進行大量的和復雜的操作時,SQL語句需要通過和編程語言一同編寫才能實現,而且實現復雜。相比之下,存儲過程可以對過程進行控制。4 4安全性 存儲過程也可以作為額外的安全層。開發人員或者用戶,都只能對數據庫中的存儲過程進行使
56、用, 而無法直接對表進行數據操作,這樣封裝了數據操作,提高安全性。5 5減少網絡流量和通信存儲過程是在數據庫服務器上運行的,在使用存儲過程中,無需將大量的SQL 語句代碼傳遞給數據庫服務器,而只需告訴數據庫服務器執行哪個存儲過程即可,而數據庫服務器則會自行執行中間處理 最新資料推薦255操作,而不會通過網絡傳遞不必要的數據。6 6模塊化 正如代碼編寫規范和設計模式一樣,通常情況下,開發團隊或者公司需要嚴謹的代碼編寫風格和良 好的協調能力,例如一個團隊有人專門負責編碼,有人專門負責數據庫開發,那么可以讓數據庫開發人 員負責數據庫的開發, 而編碼的程序員只需要使用數據庫開發人員設計的存儲過程即可。
57、在這種情況下,數據庫操作和應用程序編碼的操作被分開,在維護、管理中,也非常方便,如果數據庫存儲過程的代碼 出現問題,則只需要修改存儲過程中的代碼即可。9.5.2創建存儲過程存儲過程可以通過 SQL Server Management Studio 創建,也可以使用 .NET 框架通過編程實現 .SQL Server Management Studio 創建存儲過程比較方便,右擊【對象資源管理器】中的相應的數據庫,在下拉 菜單中選擇【可編程性】選項并選擇【存儲過程】選項。單擊右鍵,選擇【新建存儲過程】選項,系統 會自動創建一個新的標簽(tab)窗口,以提供輸入存儲過程語句,如圖9-3所示。圖9-
58、3 使用Server Management Studio創建存儲過程在tab窗口中輸入存儲過程,代碼如下所示。CREATE PROC myproc(id int,title varchar(50) OUTPUT)ASSET NOCOUNT ONDECLARE newscount intSELECT title=mynews.title,newscount=COUNT(mynews.id)FROM mynews WHERE (id=id) GROUP BY mynews.title RETURN newscount上述存儲過程返回了數據庫中新聞的標題內容。“id”表示新聞的id, title表示
59、新聞的標題,此存儲過程將返回“ title ”的值,并且返回新聞的總數。在 C#中同樣可以使用編程實現存儲過程的創 建,示例代碼如下所示。string str = CREATE PROC myproc +(+id int, +title varchar(50) OUTPUT +最新資料推薦256)+AS +SET NOCOUNT ON +DECLARE newscount int +SELECT title=mynews.title,newscount=COUNT(mynews.id) +FROM mynews + WHERE (id=id) + GROUP BY mynews.title +
60、 RETURN newscount; SqlCommand cmd = new SqlCommand(str, con);cmd.ExecuteNonQuery();/使用 cmd 的 ExecuteNonQuery 方法創建存儲過程上述代碼通過使用SqlCommand對象的ExecuteNonQuery()方法在數據庫中創建了一個存儲過程,最新資料推薦257該存儲過程用于返回了數據庫中新聞的標題內容。9.5.3調用存儲過程創建存儲過程之后,可以在 .NET應用程序中使用存儲過程。存儲過程可以看成是一個函數,可以 對存儲過程進行調用,傳遞參數,接受返回值。在調用存儲過程前,首先要與數據庫建立連
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論