




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第9章ASPNET操作數(shù)據(jù)庫(kù) 第9章ASPNET操作數(shù)據(jù)庫(kù)2 第第 7 7 章章 數(shù)據(jù)庫(kù)與數(shù)據(jù)庫(kù)與 ADO.NET ADO.NET 基礎(chǔ)基礎(chǔ) 第第 8 8 章章 Web Web 窗體的數(shù)據(jù)控件窗體的數(shù)據(jù)控件 第第 9 9 章章 ASP.NET ASP.NET 操作數(shù)據(jù)庫(kù)操作數(shù)據(jù)庫(kù) 第第 10 10 章章 訪問(wèn)其他數(shù)據(jù)源訪問(wèn)其他數(shù)據(jù)源 第9章ASPNET操作數(shù)據(jù)庫(kù)3 主講:主講:Jayce_ZouJayce_Zou 第9章ASPNET操作數(shù)據(jù)庫(kù)4 使用使用 ADO.NET ADO.NET 操作數(shù)據(jù)庫(kù)操作數(shù)據(jù)庫(kù) ASP.NET ASP.NET 創(chuàng)建和插入記錄創(chuàng)建和插入記錄 ASP.NET ASP.
2、NET 更新數(shù)據(jù)庫(kù)更新數(shù)據(jù)庫(kù) ASP.NET ASP.NET 刪除數(shù)據(jù)刪除數(shù)據(jù) 使用存儲(chǔ)過(guò)程使用存儲(chǔ)過(guò)程 第9章ASPNET操作數(shù)據(jù)庫(kù)5 在在 ADO.NET ADO.NET 中,執(zhí)行中,執(zhí)行SQLSQL語(yǔ)句有很多方法,其中推薦使用語(yǔ)句有很多方法,其中推薦使用 Command Command 命令的命令的 ExecuteNonQuery()ExecuteNonQuery()。執(zhí)行。執(zhí)行 SQL SQL 語(yǔ)句的命令的必要步驟如下語(yǔ)句的命令的必要步驟如下 所示:所示: 打開(kāi)數(shù)據(jù)連接。打開(kāi)數(shù)據(jù)連接。 創(chuàng)建一個(gè)新的創(chuàng)建一個(gè)新的 Command Command 對(duì)象。對(duì)象。 定義一個(gè)定義一個(gè) SQL S
3、QL 命令。命令。 執(zhí)行執(zhí)行 SQL SQL 命令。命令。 關(guān)閉連接。關(guān)閉連接。 第9章ASPNET操作數(shù)據(jù)庫(kù)6 示例代碼如下所示:示例代碼如下所示: string str = string str = server=(local);database=mytable;uid=sa;pwd=sa;server=(local);database=mytable;uid=sa;pwd=sa; SqlConnection con = new SqlConnection(str); SqlConnection con = new SqlConnection(str); con.Open(); con.O
4、pen(); SqlCommand cmd = new SqlCommand(insert into mynews value SqlCommand cmd = new SqlCommand(insert into mynews value (插入一條新數(shù)據(jù)插入一條新數(shù)據(jù)), con);), con); cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery(); con.Close(); con.Close(); 第9章ASPNET操作數(shù)據(jù)庫(kù)7 使用使用 INSERT INSERT 語(yǔ)句能夠完成數(shù)據(jù)插入,使用語(yǔ)句能夠完成數(shù)據(jù)插入,使用 DataSet DataS
5、et 對(duì)象也可以完對(duì)象也可以完 成數(shù)據(jù)插入。使用成數(shù)據(jù)插入。使用 DataSet DataSet 更新記錄的步驟如下所示:更新記錄的步驟如下所示: 創(chuàng)建一個(gè)創(chuàng)建一個(gè) Connection Connection 對(duì)象。對(duì)象。 創(chuàng)建一個(gè)創(chuàng)建一個(gè) DataAdapter DataAdapter 對(duì)象。對(duì)象。 使用使用 DataAdapter DataAdapter 的的 Fill Fill 方法執(zhí)行方法執(zhí)行 SELECT SELECT 命令,并填充命令,并填充 DataSetDataSet。 使用使用 DataTable DataTable 對(duì)象提供的對(duì)象提供的 NewRow NewRow 方法創(chuàng)建
6、新行。方法創(chuàng)建新行。 將數(shù)據(jù)行的字段設(shè)置為插入的值。將數(shù)據(jù)行的字段設(shè)置為插入的值。 使用使用 DataRowAdd DataRowAdd 類的類的 Add Add 方法將數(shù)據(jù)行添加到數(shù)據(jù)表中。方法將數(shù)據(jù)行添加到數(shù)據(jù)表中。 把把 DataAdapter DataAdapter 類的類的 InsertCommand InsertCommand 屬性設(shè)置成需要插入記錄的屬性設(shè)置成需要插入記錄的 INSERT INSERT 語(yǔ)句。語(yǔ)句。 使用數(shù)據(jù)適配器提供的使用數(shù)據(jù)適配器提供的 Update Update 方法將新記錄插入數(shù)據(jù)庫(kù)。方法將新記錄插入數(shù)據(jù)庫(kù)。 使用使用 DataSet DataSet 類提
7、供的類提供的 AcceptChanges AcceptChanges 方法將數(shù)據(jù)庫(kù)與內(nèi)存中的方法將數(shù)據(jù)庫(kù)與內(nèi)存中的 數(shù)據(jù)保持一致。數(shù)據(jù)保持一致。 第9章ASPNET操作數(shù)據(jù)庫(kù)8 string str = string str = server=(local);database=mytable;uid=sa;pwd=sa;server=(local);database=mytable;uid=sa;pwd=sa; SqlConnection con = new SqlConnection(str); SqlConnection con = new SqlConnection(str); con.
8、Open(); con.Open(); string strsql = select string strsql = select * * from mynews; from mynews; SqlDataAdapter da = new SqlDataAdapter(strsql, con); SqlDataAdapter da = new SqlDataAdapter(strsql, con); SqlCommandBuilder build = new SqlCommandBuilder(da); SqlCommandBuilder build = new SqlCommandBuild
9、er(da); DataSet ds = new DataSet(); DataSet ds = new DataSet(); /創(chuàng)建數(shù)據(jù)集創(chuàng)建數(shù)據(jù)集 da.Fill(ds, “datatable”); da.Fill(ds, “datatable”); /填充數(shù)據(jù)集填充數(shù)據(jù)集 DataTable tb = ds.Tables“datatable”; DataTable tb = ds.Tables“datatable”; /創(chuàng)建表創(chuàng)建表 tb.PrimaryKey = new DataColumntb.Columns“id”;/tb.PrimaryKey = new DataColumntb
10、.Columns“id”;/創(chuàng)建表的主鍵創(chuàng)建表的主鍵 DataRow row = ds.Tablesdatatable.NewRow(); DataRow row = ds.Tablesdatatable.NewRow(); rowtitle = rowtitle = 使用使用 DataSet DataSet 插入新行插入新行; ; /賦值新列賦值新列 rowid = 15;rowid = 15; ds.Tables“datatable”.Rows.Add(row);ds.Tables“datatable”.Rows.Add(row);/添加新行添加新行 da.Update(ds, datat
11、able); da.Update(ds, datatable); /更新數(shù)據(jù)更新數(shù)據(jù) 第9章ASPNET操作數(shù)據(jù)庫(kù)9 如需要執(zhí)行如需要執(zhí)行 UPDATE UPDATE 語(yǔ)句時(shí),同樣可以使用語(yǔ)句時(shí),同樣可以使用 Command Command 對(duì)象執(zhí)行語(yǔ)句對(duì)象執(zhí)行語(yǔ)句 。Command Command 對(duì)象基本上能夠執(zhí)行對(duì)象基本上能夠執(zhí)行 所有需要進(jìn)行數(shù)據(jù)更新的所有需要進(jìn)行數(shù)據(jù)更新的SQLSQL語(yǔ)句。語(yǔ)句。 示例代碼如下所示示例代碼如下所示: : string str = string str = server=(local);database=mytable;uid=sa;pwd=sa;ser
12、ver=(local);database=mytable;uid=sa;pwd=sa; SqlConnection con = new SqlConnection(str); SqlConnection con = new SqlConnection(str); con.Open(); con.Open(); SqlCommand cmd = new SqlCommand(UPDATE mynews SET SqlCommand cmd = new SqlCommand(UPDATE mynews SET title=title=修改后的數(shù)據(jù)修改后的數(shù)據(jù)where id=3“, con); w
13、here id=3“, con); cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery(); con.Close();con.Close(); 第9章ASPNET操作數(shù)據(jù)庫(kù)10 DataSet DataSet 更新記錄的步驟如下所示:更新記錄的步驟如下所示: 創(chuàng)建一個(gè)創(chuàng)建一個(gè) Connection Connection 對(duì)象。對(duì)象。 創(chuàng)建一個(gè)創(chuàng)建一個(gè) DataAdapter DataAdapter 對(duì)象。對(duì)象。 初始化適配器。初始化適配器。 使用數(shù)據(jù)適配器的使用數(shù)據(jù)適配器的 Fill Fill 方法執(zhí)行方法執(zhí)行 SELECT SELECT 命令,并填充命令,并
14、填充 DataSetDataSet 。 執(zhí)行執(zhí)行 SqlCommandBuilder SqlCommandBuilder 方法生成方法生成 UpdataCommand UpdataCommand 方法。方法。 創(chuàng)建創(chuàng)建 DataTable DataTable 對(duì)象并指定相應(yīng)的對(duì)象并指定相應(yīng)的 DataSet DataSet 中的表。中的表。 創(chuàng)建創(chuàng)建 DataRow DataRow 對(duì)象并查找需要修改的相應(yīng)行。對(duì)象并查找需要修改的相應(yīng)行。 更改更改 DataRow DataRow 對(duì)象中的列的值。對(duì)象中的列的值。 使用使用 Update Update 方法進(jìn)行數(shù)據(jù)更新。方法進(jìn)行數(shù)據(jù)更新。 第9
15、章ASPNET操作數(shù)據(jù)庫(kù)11 string str = string str = “server=(local);database=mytable;uid=sa;pwd=sa”;“server=(local);database=mytable;uid=sa;pwd=sa”; SqlConnection con = new SqlConnection(str); SqlConnection con = new SqlConnection(str); con.Open(); con.Open(); string strsql = select string strsql = select * *
16、from mynews; from mynews; SqlDataAdapter da = new SqlDataAdapter(strsql, con);SqlDataAdapter da = new SqlDataAdapter(strsql, con); SqlCommandBuilder build = new SqlCommandBuilder(da);SqlCommandBuilder build = new SqlCommandBuilder(da); DataSet ds = new DataSet(); DataSet ds = new DataSet(); /使用使用 Da
17、taSetDataSet da.Fill(ds, datatable); da.Fill(ds, datatable); /使用使用 Fill Fill 方法填充方法填充 DataSetDataSet DataTable tb = ds.Tablesdatatable;DataTable tb = ds.Tablesdatatable; tb.PrimaryKey = new DataColumn tb.Columnsid ; tb.PrimaryKey = new DataColumn tb.Columnsid ; DataRow row = tb.Rows.Find(1);DataRow
18、row = tb.Rows.Find(1); rowtitle = rowtitle = 新標(biāo)題新標(biāo)題; da.Update(ds, datatable);da.Update(ds, datatable); 第9章ASPNET操作數(shù)據(jù)庫(kù)12 當(dāng)需要執(zhí)行刪除語(yǔ)句,可以使用當(dāng)需要執(zhí)行刪除語(yǔ)句,可以使用 Command Command 對(duì)象來(lái)刪除數(shù)據(jù)對(duì)象來(lái)刪除數(shù)據(jù) 庫(kù)中的記錄。庫(kù)中的記錄。 示例代碼如下所示示例代碼如下所示: : string str = string str = server=(local);database=mytable;uid=sa;pwd=sa; server=(local
19、);database=mytable;uid=sa;pwd=sa; SqlConnection con = new SqlConnection(str);SqlConnection con = new SqlConnection(str); con.Open(); con.Open(); SqlCommand cmd = new SqlCommand(Delete mynews where id=3, SqlCommand cmd = new SqlCommand(Delete mynews where id=3, con);con); cmd.ExecuteNonQuery(); cmd.E
20、xecuteNonQuery(); con.Close(); con.Close(); 第9章ASPNET操作數(shù)據(jù)庫(kù)13 使用使用 DataSet DataSet 刪除記錄和使用刪除記錄和使用 DataSet DataSet 更新記錄非常的相似,更新記錄非常的相似, DataSet DataSet 刪除記錄的步驟如下所示刪除記錄的步驟如下所示 : 創(chuàng)建一個(gè)創(chuàng)建一個(gè) Connection Connection 對(duì)象。對(duì)象。 創(chuàng)建一個(gè)創(chuàng)建一個(gè) DataAdapter DataAdapter 對(duì)象。對(duì)象。 初始化適配器。初始化適配器。 使用數(shù)據(jù)適配器的使用數(shù)據(jù)適配器的 Fill Fill 方法執(zhí)行方
21、法執(zhí)行 SELECT SELECT 命令,并填充命令,并填充 DataSetDataSet 。 執(zhí)行執(zhí)行 SqlCommandBuilder SqlCommandBuilder 方法生成方法生成 UpdataCommand UpdataCommand 方法。方法。 創(chuàng)建創(chuàng)建 DataTable DataTable 對(duì)象并指定相應(yīng)的對(duì)象并指定相應(yīng)的 DataSet DataSet 中的表。中的表。 創(chuàng)建創(chuàng)建 DataRow DataRow 對(duì)象并查找需要修改的相應(yīng)行。對(duì)象并查找需要修改的相應(yīng)行。 使用使用 Delete Delete 方法刪除該行。方法刪除該行。 使用使用 Updata Upda
22、ta 方法進(jìn)行數(shù)據(jù)更新。方法進(jìn)行數(shù)據(jù)更新。 第9章ASPNET操作數(shù)據(jù)庫(kù)14 string str = string str = “server=(local);database=mytable;uid=sa;pwd=sa”;“server=(local);database=mytable;uid=sa;pwd=sa”; SqlConnection con = new SqlConnection(str); SqlConnection con = new SqlConnection(str); con.Open(); con.Open(); string strsql = select str
23、ing strsql = select * * from mynews; from mynews; SqlDataAdapter da = new SqlDataAdapter(strsql, con);SqlDataAdapter da = new SqlDataAdapter(strsql, con); SqlCommandBuilder build = new SqlCommandBuilder(da);SqlCommandBuilder build = new SqlCommandBuilder(da); DataSet ds = new DataSet(); DataSet ds =
24、 new DataSet(); /使用使用 DataSetDataSet da.Fill(ds, datatable); da.Fill(ds, datatable); /使用使用 Fill Fill 方法填充方法填充 DataSetDataSet DataTable tb = ds.Tablesdatatable;DataTable tb = ds.Tablesdatatable; tb.PrimaryKey = new DataColumn tb.Columnsid ; tb.PrimaryKey = new DataColumn tb.Columnsid ; DataRow row =
25、tb.Rows.Find(3);DataRow row = tb.Rows.Find(3); row.Delete();row.Delete(); da.Update(ds, datatable);da.Update(ds, datatable); 第9章ASPNET操作數(shù)據(jù)庫(kù)15 使用使用 ExecuteReader()ExecuteReader()操作數(shù)據(jù)庫(kù)操作數(shù)據(jù)庫(kù) , ExecuteReader()ExecuteReader()方法返回的是一個(gè)方法返回的是一個(gè) SqlDataReader SqlDataReader 對(duì)象或?qū)ο蠡?OleDbDataReaderOleDbDataRead
26、er對(duì)象。對(duì)象。 當(dāng)使用當(dāng)使用 DataReader DataReader 對(duì)象時(shí),不會(huì)像對(duì)象時(shí),不會(huì)像 DataSet DataSet 那樣提供無(wú)連接的數(shù)據(jù)庫(kù)副那樣提供無(wú)連接的數(shù)據(jù)庫(kù)副 本,本,DataReader DataReader 類被設(shè)計(jì)為產(chǎn)生只讀、只進(jìn)的數(shù)據(jù)流。類被設(shè)計(jì)為產(chǎn)生只讀、只進(jìn)的數(shù)據(jù)流。 這些數(shù)據(jù)流都是從數(shù)據(jù)庫(kù)返回的。所以,每次的訪問(wèn)或操作只有一這些數(shù)據(jù)流都是從數(shù)據(jù)庫(kù)返回的。所以,每次的訪問(wèn)或操作只有一 個(gè)記錄保個(gè)記錄保 存在服務(wù)器的內(nèi)存中。存在服務(wù)器的內(nèi)存中。 相比與相比與 DataSet DataSet 而言,而言,DataReader DataReader 具有較快的
27、訪問(wèn)能力,并且能夠使用較具有較快的訪問(wèn)能力,并且能夠使用較 少的服務(wù)器資源。少的服務(wù)器資源。 DataReader DataReader 對(duì)象提供了對(duì)象提供了“游標(biāo)游標(biāo)”形式的讀取方法,當(dāng)從結(jié)果中讀取了一行形式的讀取方法,當(dāng)從結(jié)果中讀取了一行 ,則,則“游標(biāo)游標(biāo)”會(huì)繼續(xù)讀取到下一行。通過(guò)會(huì)繼續(xù)讀取到下一行。通過(guò) Read Read 方法可以判斷數(shù)據(jù)是否還有方法可以判斷數(shù)據(jù)是否還有 下一行,如果存在數(shù)據(jù),則繼續(xù)運(yùn)行并返回下一行,如果存在數(shù)據(jù),則繼續(xù)運(yùn)行并返回 truetrue,否則返回,否則返回 falsefalse。 第9章ASPNET操作數(shù)據(jù)庫(kù)16 示例代碼如下示例代碼如下: : strin
28、g str = string str = server=(local);database=mytable;uid=sa;pwd=sa; server=(local);database=mytable;uid=sa;pwd=sa; SqlConnection con = new SqlConnection(str);SqlConnection con = new SqlConnection(str); con.Open(); con.Open(); /打開(kāi)連接打開(kāi)連接 string strsql = select string strsql = select * * from mynews; f
29、rom mynews; /SQL /SQL 查詢語(yǔ)句查詢語(yǔ)句 SqlCommand cmd = new SqlCommand(strsql, con); SqlCommand cmd = new SqlCommand(strsql, con); SqlDataReader rd = cmd.ExecuteReader(); /SqlDataReader rd = cmd.ExecuteReader(); /初始化初始化 DataReader DataReader 對(duì)象對(duì)象 while (rd.Read()while (rd.Read() Response.Write(rdtitle.ToStr
30、ing(); Response.Write(rdtitle.ToString(); /通過(guò)索引獲取列通過(guò)索引獲取列 rd.Close(); rd.Close(); /關(guān)閉關(guān)閉 DataReader DataReader 對(duì)象對(duì)象 第9章ASPNET操作數(shù)據(jù)庫(kù)17 ExecuteReader()ExecuteReader()可以執(zhí)行插入、更新以及刪除等,示例代碼如下可以執(zhí)行插入、更新以及刪除等,示例代碼如下: : SqlConnection con = new SqlConnection(str); SqlConnection con = new SqlConnection(str); con.
31、Open(); con.Open(); strsql = insert into mynews values (strsql = insert into mynews values (執(zhí)行更新后的標(biāo)題執(zhí)行更新后的標(biāo)題); ); SqlCommand cmd = new SqlCommand(strsql, con); SqlCommand cmd = new SqlCommand(strsql, con); SqlDataReader rd = cmd.ExecuteReader(); SqlDataReader rd = cmd.ExecuteReader(); while (rd.Read
32、() while (rd.Read() Response.Write(rdtitle.ToString() + );Response.Write(rdtitle.ToString() + ); rd.Close(); rd.Close(); 當(dāng)使用當(dāng)使用 Read Read 方法遍歷讀取數(shù)據(jù)庫(kù)時(shí),并不會(huì)顯示相應(yīng)的數(shù)據(jù)信息,方法遍歷讀取數(shù)據(jù)庫(kù)時(shí),并不會(huì)顯示相應(yīng)的數(shù)據(jù)信息, 因?yàn)椴皇遣樵冋Z(yǔ)句,則返回一個(gè)沒(méi)有任何數(shù)據(jù)的因?yàn)椴皇遣樵冋Z(yǔ)句,則返回一個(gè)沒(méi)有任何數(shù)據(jù)的 System.Data.OleDb.OleDbDataReader System.Data.OleDb.OleDbDataReader 類型
33、的集(類型的集(EOFEOF)。)。 第9章ASPNET操作數(shù)據(jù)庫(kù)18 使用使用 ExecuteNonQuery()ExecuteNonQuery()操作數(shù)據(jù)庫(kù)時(shí),操作數(shù)據(jù)庫(kù)時(shí),ExecuteNonQuery()ExecuteNonQuery()并不返回并不返回 DataReader DataReader 對(duì)象,返回的是一個(gè)整型的值,代表執(zhí)行某個(gè)對(duì)象,返回的是一個(gè)整型的值,代表執(zhí)行某個(gè) SQL SQL 語(yǔ)句后,在語(yǔ)句后,在 數(shù)據(jù)庫(kù)中影響的行數(shù)。數(shù)據(jù)庫(kù)中影響的行數(shù)。 ExecuteNonQuery()ExecuteNonQuery()通常情況下為數(shù)據(jù)庫(kù)事務(wù)處理的首選,當(dāng)需要執(zhí)行插入通常情況下為數(shù)
34、據(jù)庫(kù)事務(wù)處理的首選,當(dāng)需要執(zhí)行插入 、刪除、更新等操作時(shí),首選、刪除、更新等操作時(shí),首選 ExecuteNonQuery()ExecuteNonQuery()。 對(duì)于更新、插入和刪除的對(duì)于更新、插入和刪除的 SQL SQL 句,句,ExecuteNonQuery()ExecuteNonQuery()方法的返回值為該命方法的返回值為該命 令所影響的行數(shù)。對(duì)于令所影響的行數(shù)。對(duì)于 “CREATE TABLE”CREATE TABLE”和和“DROP TABLE”DROP TABLE”語(yǔ)句,返回值語(yǔ)句,返回值 為為 0 0,而對(duì)于所有其他類型的語(yǔ)句,返回值為,而對(duì)于所有其他類型的語(yǔ)句,返回值為-1-
35、1。 注意:有些項(xiàng)目中,通過(guò)判斷注意:有些項(xiàng)目中,通過(guò)判斷 ExecuteNonQuery()ExecuteNonQuery()的返回值來(lái)判斷的返回值來(lái)判斷 SQL SQL 語(yǔ)語(yǔ) 句是否執(zhí)行成功,這樣是有失偏頗的,因?yàn)楫?dāng)使用創(chuàng)建表的語(yǔ)句時(shí),就算執(zhí)句是否執(zhí)行成功,這樣是有失偏頗的,因?yàn)楫?dāng)使用創(chuàng)建表的語(yǔ)句時(shí),就算執(zhí) 行成功也會(huì)返回行成功也會(huì)返回-1-1。 第9章ASPNET操作數(shù)據(jù)庫(kù)19 ExecuteNonQuery()ExecuteNonQuery()操作數(shù)據(jù)示例代碼如下所示:操作數(shù)據(jù)示例代碼如下所示: string str = string str = server=(local);data
36、base=mytable;uid=sa;pwd=sa;server=(local);database=mytable;uid=sa;pwd=sa; SqlConnection con = new SqlConnection(str); SqlConnection con = new SqlConnection(str); con.Open(); con.Open(); string strsql = delete from mynews where id4; string strsql = delete from mynews where id4; SqlCommand cmd = new S
37、qlCommand(strsql, con); SqlCommand cmd = new SqlCommand(strsql, con); /返回影響行數(shù)返回影響行數(shù) Label1.Text = Label1.Text = 該操作影響了該操作影響了 + cmd.ExecuteNonQuery() + + cmd.ExecuteNonQuery() + 行行; 第9章ASPNET操作數(shù)據(jù)庫(kù)20 ExecuteScalar()ExecuteScalar()方法也用來(lái)執(zhí)行方法也用來(lái)執(zhí)行SQLSQL語(yǔ)句語(yǔ)句 , 但是但是 ExecuteScalar()ExecuteScalar()執(zhí)行執(zhí)行 SQLSQ
38、L語(yǔ)句后的返回值與語(yǔ)句后的返回值與 ExecuteNonQuery()ExecuteNonQuery()并不相同,并不相同,ExecuteScalar()ExecuteScalar()方法方法 的返回值的數(shù)據(jù)類型是的返回值的數(shù)據(jù)類型是 Object Object 類型。類型。 如果執(zhí)行的如果執(zhí)行的SQLSQL語(yǔ)句是一個(gè)查詢語(yǔ)句(語(yǔ)句是一個(gè)查詢語(yǔ)句(SELECTSELECT),則返回結(jié)果是查詢后的第),則返回結(jié)果是查詢后的第 一行的第一列,如果執(zhí)行的一行的第一列,如果執(zhí)行的SQLSQL語(yǔ)句不是一個(gè)查詢語(yǔ)句,則會(huì)返回一個(gè)未實(shí)語(yǔ)句不是一個(gè)查詢語(yǔ)句,則會(huì)返回一個(gè)未實(shí) 例化的對(duì)象,必須通過(guò)類型轉(zhuǎn)換來(lái)顯示
39、。例化的對(duì)象,必須通過(guò)類型轉(zhuǎn)換來(lái)顯示。 示例代碼如下所示:示例代碼如下所示: string str = string str = server=(local);database=mytable;uid=sa;pwd=saserver=(local);database=mytable;uid=sa;pwd=sa ; SqlConnection con = new SqlConnection(str); SqlConnection con = new SqlConnection(str); /創(chuàng)建連接對(duì)象創(chuàng)建連接對(duì)象 con.Open(); con.Open(); string strsql =
40、select string strsql = select * * from mynews order by id desc; from mynews order by id desc; SqlCommand cmd = new SqlCommand(strsql, con);SqlCommand cmd = new SqlCommand(strsql, con); Label1.Text = Label1.Text = 查詢出了查詢出了 Id Id 為為 + cmd.ExecuteScalar(); + cmd.ExecuteScalar(); 第9章ASPNET操作數(shù)據(jù)庫(kù)21 當(dāng)插入一條數(shù)
41、據(jù)信息時(shí),常常需要馬上知道剛才插入的值,則可以使當(dāng)插入一條數(shù)據(jù)信息時(shí),常常需要馬上知道剛才插入的值,則可以使 用用 ExecuteScalar()ExecuteScalar()方法。示例代碼如下所示:方法。示例代碼如下所示: string str = string str = server=(local);database=mytable;uid=sa;pwd=sa;server=(local);database=mytable;uid=sa;pwd=sa; SqlConnection con = new SqlConnection(str); SqlConnection con = new
42、SqlConnection(str); con.Open(); con.Open(); string strsql = insert into mynews values string strsql = insert into mynews values (剛剛插入的剛剛插入的 id id 是多少是多少?)?) SELECT SELECT IDENTITYIDENTITY as bh; as bh; SqlCommand cmd = new SqlCommand(strsql, con);SqlCommand cmd = new SqlCommand(strsql, con); Label1.
43、Text = Label1.Text = 剛剛插入的行的剛剛插入的行的 id id 是是 + cmd.ExecuteScalar(); + cmd.ExecuteScalar(); 第9章ASPNET操作數(shù)據(jù)庫(kù)22 在在 Web Web 應(yīng)用程序的開(kāi)發(fā)過(guò)程中,應(yīng)用程序的開(kāi)發(fā)過(guò)程中,Web Web 安全是非常重要的,現(xiàn)存的很多網(wǎng)站安全是非常重要的,現(xiàn)存的很多網(wǎng)站 也都存在一些非常嚴(yán)重的安全漏洞,其中也都存在一些非常嚴(yán)重的安全漏洞,其中 SQL SQL 注入是非常常見(jiàn)的漏洞,如注入是非常常見(jiàn)的漏洞,如 果將查詢語(yǔ)句進(jìn)行參數(shù)化查詢,可以減少果將查詢語(yǔ)句進(jìn)行參數(shù)化查詢,可以減少 SQL SQL 注入漏
44、洞的概率,參數(shù)化查注入漏洞的概率,參數(shù)化查 詢示例代碼如下所示。詢示例代碼如下所示。 string strsql = select string strsql = select * * from mynews where id= from mynews where id= idid; 上述代碼使用了參數(shù)化查詢,在存儲(chǔ)過(guò)程中,參數(shù)化是非常常見(jiàn)的,存儲(chǔ)過(guò)上述代碼使用了參數(shù)化查詢,在存儲(chǔ)過(guò)程中,參數(shù)化是非常常見(jiàn)的,存儲(chǔ)過(guò) 程通過(guò)程通過(guò) Command Command 對(duì)象進(jìn)行參數(shù)的添加和賦值。同樣,參數(shù)化查詢也可以通對(duì)象進(jìn)行參數(shù)的添加和賦值。同樣,參數(shù)化查詢也可以通 過(guò)過(guò) Command Comma
45、nd 對(duì)象進(jìn)行添加和賦值,參數(shù)化查詢過(guò)程如下所示對(duì)象進(jìn)行添加和賦值,參數(shù)化查詢過(guò)程如下所示: : 創(chuàng)建一個(gè)創(chuàng)建一個(gè) Command Command 對(duì)象。對(duì)象。 Command Command 對(duì)象增加一個(gè)參數(shù)。對(duì)象增加一個(gè)參數(shù)。 通過(guò)索引對(duì)通過(guò)索引對(duì) Command Command 參數(shù)進(jìn)行賦值。參數(shù)進(jìn)行賦值。 執(zhí)行執(zhí)行 ExecuteReader ExecuteReader 方法返回個(gè)方法返回個(gè) DataReader DataReader 對(duì)象。對(duì)象。 第9章ASPNET操作數(shù)據(jù)庫(kù)23 通過(guò)通過(guò) Command Command 對(duì)象可以為存儲(chǔ)過(guò)程,以及參數(shù)化查詢語(yǔ)句進(jìn)行參數(shù)對(duì)象可以為存儲(chǔ)過(guò)
46、程,以及參數(shù)化查詢語(yǔ)句進(jìn)行參數(shù) 的添加,示例代碼如下所示的添加,示例代碼如下所示: : string str = string str = server=(local);database=mytable;uid=sa;pwd=sa; server=(local);database=mytable;uid=sa;pwd=sa; SqlConnection con = new SqlConnection(str);SqlConnection con = new SqlConnection(str); con.Open();con.Open(); string strsql = select str
47、ing strsql = select * * from mynews where id = from mynews where id = bhbh; SqlCommand cmd = new SqlCommand(strsql, con); SqlCommand cmd = new SqlCommand(strsql, con); cmd.Parameters.Add(cmd.Parameters.Add(bhbh, SqlDbType.Int); , SqlDbType.Int); /增加參數(shù)增加參數(shù)bhbh cmd.Parameters0.Value = 4; cmd.Parameter
48、s0.Value = 4; /通過(guò)索引為參數(shù)賦值通過(guò)索引為參數(shù)賦值 SqlDataReader dr = cmd.ExecuteReader(); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read() while (dr.Read() Response.Write(drtitle.ToString()+);Response.Write(drtitle.ToString()+); 參數(shù)化查詢能夠有效的解決一些安全問(wèn)題,提高參數(shù)化查詢能夠有效的解決一些安全問(wèn)題,提高 Web Web 應(yīng)用的安全性應(yīng)用的安全性 。 注意:如果未初始化注意:如
49、果未初始化 Parameter Parameter 數(shù)據(jù)類型的屬性,但設(shè)置了數(shù)據(jù)類型的屬性,但設(shè)置了 Value Value 屬性,那么屬性,那么 Parameter Parameter 會(huì)自動(dòng)選擇合適的數(shù)據(jù)類型。會(huì)自動(dòng)選擇合適的數(shù)據(jù)類型。 第9章ASPNET操作數(shù)據(jù)庫(kù)24 在數(shù)據(jù)庫(kù)操作中,已經(jīng)有了在數(shù)據(jù)庫(kù)操作中,已經(jīng)有了 SQL SQL 語(yǔ)句,為何還需要存儲(chǔ)過(guò)程。因?yàn)榇鎯?chǔ)過(guò)語(yǔ)句,為何還需要存儲(chǔ)過(guò)程。因?yàn)榇鎯?chǔ)過(guò) 程有程有 SQL SQL 語(yǔ)句不能具備的特點(diǎn)和優(yōu)點(diǎn),以至于存儲(chǔ)過(guò)程能在嚴(yán)格的數(shù)據(jù)庫(kù)語(yǔ)句不能具備的特點(diǎn)和優(yōu)點(diǎn),以至于存儲(chǔ)過(guò)程能在嚴(yán)格的數(shù)據(jù)庫(kù) 驅(qū)動(dòng)的應(yīng)用程序中起到重要的作用。存儲(chǔ)和過(guò)程有
50、點(diǎn)包括:驅(qū)動(dòng)的應(yīng)用程序中起到重要的作用。存儲(chǔ)和過(guò)程有點(diǎn)包括: 事務(wù)處理。事務(wù)處理。 存儲(chǔ)過(guò)程中,包括多個(gè)存儲(chǔ)過(guò)程中,包括多個(gè) SQL SQL 語(yǔ)句,存儲(chǔ)過(guò)程中的語(yǔ)句,存儲(chǔ)過(guò)程中的 SQL SQL 語(yǔ)句屬于事務(wù)處理的范疇。語(yǔ)句屬于事務(wù)處理的范疇。 也就是說(shuō),存儲(chǔ)過(guò)程類似于一個(gè)函數(shù),當(dāng)執(zhí)行存儲(chǔ)過(guò)程時(shí),存儲(chǔ)過(guò)程中的也就是說(shuō),存儲(chǔ)過(guò)程類似于一個(gè)函數(shù),當(dāng)執(zhí)行存儲(chǔ)過(guò)程時(shí),存儲(chǔ)過(guò)程中的 SQL SQL 語(yǔ)語(yǔ) 句要不都執(zhí)行,要不都不執(zhí)行。句要不都執(zhí)行,要不都不執(zhí)行。 速度和性能。速度和性能。 存儲(chǔ)過(guò)程由數(shù)據(jù)庫(kù)服務(wù)器編譯和優(yōu)化,優(yōu)化包括使用存儲(chǔ)過(guò)程在運(yùn)行時(shí)所存儲(chǔ)過(guò)程由數(shù)據(jù)庫(kù)服務(wù)器編譯和優(yōu)化,優(yōu)化包括使用存儲(chǔ)過(guò)程
51、在運(yùn)行時(shí)所 必須的特定數(shù)據(jù)庫(kù)的結(jié)構(gòu)信息,這樣在執(zhí)行過(guò)程中會(huì)節(jié)約很多時(shí)間。存儲(chǔ)必須的特定數(shù)據(jù)庫(kù)的結(jié)構(gòu)信息,這樣在執(zhí)行過(guò)程中會(huì)節(jié)約很多時(shí)間。存儲(chǔ) 過(guò)程完全在數(shù)據(jù)庫(kù)服務(wù)器上執(zhí)行,避免了大量的過(guò)程完全在數(shù)據(jù)庫(kù)服務(wù)器上執(zhí)行,避免了大量的 SQL SQL 語(yǔ)句代碼的傳遞,語(yǔ)句代碼的傳遞, 對(duì)于循環(huán)使用對(duì)于循環(huán)使用 SQL SQL 語(yǔ)句而言,存儲(chǔ)過(guò)程在速度和性能上都被優(yōu)化。語(yǔ)句而言,存儲(chǔ)過(guò)程在速度和性能上都被優(yōu)化。 第9章ASPNET操作數(shù)據(jù)庫(kù)25 過(guò)程控制。過(guò)程控制。 在編寫(xiě)存儲(chǔ)過(guò)程中,可以使用在編寫(xiě)存儲(chǔ)過(guò)程中,可以使用 IF ELSEIF ELSE、FOR FOR 以及以及 WHILE WHILE 循環(huán)
52、,這些語(yǔ)循環(huán),這些語(yǔ) 句并不能在句并不能在 SQL SQL 語(yǔ)句中編寫(xiě),語(yǔ)句中編寫(xiě), 但是可以在存儲(chǔ)過(guò)程中編寫(xiě)。當(dāng)需要進(jìn)行但是可以在存儲(chǔ)過(guò)程中編寫(xiě)。當(dāng)需要進(jìn)行 大量的和復(fù)雜的操作時(shí),大量的和復(fù)雜的操作時(shí),SQL SQL 語(yǔ)句需要通過(guò)和編程語(yǔ)言一同編寫(xiě)才能實(shí)現(xiàn)語(yǔ)句需要通過(guò)和編程語(yǔ)言一同編寫(xiě)才能實(shí)現(xiàn) ,而且實(shí)現(xiàn)復(fù)雜。相比之下,存儲(chǔ)過(guò)程可以對(duì)過(guò)程進(jìn)行控制。,而且實(shí)現(xiàn)復(fù)雜。相比之下,存儲(chǔ)過(guò)程可以對(duì)過(guò)程進(jìn)行控制。 安全性。安全性。 存儲(chǔ)過(guò)程也可以作為額外的安全層。開(kāi)發(fā)人員或者用戶,都只能對(duì)數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程也可以作為額外的安全層。開(kāi)發(fā)人員或者用戶,都只能對(duì)數(shù)據(jù)庫(kù) 中的存儲(chǔ)過(guò)程進(jìn)行使用,而無(wú)法直接對(duì)表進(jìn)行數(shù)據(jù)
53、操作,這樣封裝了數(shù)據(jù)中的存儲(chǔ)過(guò)程進(jìn)行使用,而無(wú)法直接對(duì)表進(jìn)行數(shù)據(jù)操作,這樣封裝了數(shù)據(jù) 操作,提高安全性。操作,提高安全性。 第9章ASPNET操作數(shù)據(jù)庫(kù)26 減少網(wǎng)絡(luò)流量和通信。減少網(wǎng)絡(luò)流量和通信。 存儲(chǔ)過(guò)程是在數(shù)據(jù)庫(kù)服務(wù)器上運(yùn)行的,在使用存儲(chǔ)過(guò)程中,無(wú)需將大量的存儲(chǔ)過(guò)程是在數(shù)據(jù)庫(kù)服務(wù)器上運(yùn)行的,在使用存儲(chǔ)過(guò)程中,無(wú)需將大量的 SQL SQL 語(yǔ)句代碼傳遞給數(shù)據(jù)庫(kù)服務(wù)器,而只需告訴數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行哪個(gè)存語(yǔ)句代碼傳遞給數(shù)據(jù)庫(kù)服務(wù)器,而只需告訴數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行哪個(gè)存 儲(chǔ)過(guò)程即可,而數(shù)據(jù)庫(kù)服務(wù)器則會(huì)自行執(zhí)行中間處理操作,儲(chǔ)過(guò)程即可,而數(shù)據(jù)庫(kù)服務(wù)器則會(huì)自行執(zhí)行中間處理操作, 而不會(huì)通過(guò)而不會(huì)通過(guò) 網(wǎng)絡(luò)
54、傳遞不必要的數(shù)據(jù)。網(wǎng)絡(luò)傳遞不必要的數(shù)據(jù)。 模塊化。模塊化。 正如代碼編寫(xiě)規(guī)范和設(shè)計(jì)模式一樣,通常情況下,開(kāi)發(fā)團(tuán)隊(duì)或者公司需要正如代碼編寫(xiě)規(guī)范和設(shè)計(jì)模式一樣,通常情況下,開(kāi)發(fā)團(tuán)隊(duì)或者公司需要 嚴(yán)謹(jǐn)?shù)拇a編寫(xiě)風(fēng)格和良好的協(xié)調(diào)能力,例如一個(gè)團(tuán)隊(duì)有人專門(mén)負(fù)責(zé)編碼嚴(yán)謹(jǐn)?shù)拇a編寫(xiě)風(fēng)格和良好的協(xié)調(diào)能力,例如一個(gè)團(tuán)隊(duì)有人專門(mén)負(fù)責(zé)編碼 ,有人專門(mén)負(fù)責(zé)數(shù)據(jù)庫(kù)開(kāi)發(fā),那么可以讓數(shù)據(jù)庫(kù)開(kāi)發(fā)人員負(fù)責(zé)數(shù)據(jù)庫(kù)的開(kāi),有人專門(mén)負(fù)責(zé)數(shù)據(jù)庫(kù)開(kāi)發(fā),那么可以讓數(shù)據(jù)庫(kù)開(kāi)發(fā)人員負(fù)責(zé)數(shù)據(jù)庫(kù)的開(kāi) 發(fā),而編碼的程序員只需要使用數(shù)據(jù)庫(kù)開(kāi)發(fā)人員設(shè)計(jì)的存儲(chǔ)過(guò)程即可。在發(fā),而編碼的程序員只需要使用數(shù)據(jù)庫(kù)開(kāi)發(fā)人員設(shè)計(jì)的存儲(chǔ)過(guò)程即可。在 這種情況下,數(shù)據(jù)庫(kù)操
55、作和應(yīng)用程序編碼的操作被分開(kāi),在維護(hù)、管理中這種情況下,數(shù)據(jù)庫(kù)操作和應(yīng)用程序編碼的操作被分開(kāi),在維護(hù)、管理中 ,也非常方便,如果數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的代碼出現(xiàn)問(wèn)題,則只需要修改存儲(chǔ),也非常方便,如果數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的代碼出現(xiàn)問(wèn)題,則只需要修改存儲(chǔ) 過(guò)程中的代碼即可。過(guò)程中的代碼即可。 第9章ASPNET操作數(shù)據(jù)庫(kù)27 示例代碼如如下所示:示例代碼如如下所示: string str = string str = server=(local);database=mytable;uid=sa;pwd=Sa; server=(local);database=mytable;uid=sa;pwd=Sa; Sql
56、Connection con = new SqlConnection(str);SqlConnection con = new SqlConnection(str); con.Open(); con.Open(); /使用存儲(chǔ)過(guò)程使用存儲(chǔ)過(guò)程 SqlCommand cmd = new SqlCommand(“getdetail”, con); SqlCommand cmd = new SqlCommand(“getdetail”, con); /設(shè)置設(shè)置 Command Command 對(duì)象的類型對(duì)象的類型 cmd.CommandType = CommandType.StoredProcedu
57、re; cmd.CommandType = CommandType.StoredProcedure; 第9章ASPNET操作數(shù)據(jù)庫(kù)28 /增加參數(shù)增加參數(shù) id id SqlParameter spr = cmd.Parameters.Add(SqlParameter spr = cmd.Parameters.Add(iid, SqlDbType.Int); d, SqlDbType.Int); spr = cmd.Parameters.Add(spr = cmd.Parameters.Add(titltitle, SqlDbType.NChar,50); e, SqlDbType.NChar
58、,50); spr.Direction = ParameterDirection.Output; spr.Direction = ParameterDirection.Output; /該參數(shù)是輸出參數(shù)該參數(shù)是輸出參數(shù) spr = cmd.Parameters.Add(spr = cmd.Parameters.Add(“count“count”, SqlDbType.Int); ”, SqlDbType.Int); spr.Direction = ParameterDirection.ReturnValue; /spr.Direction = ParameterDirection.Return
59、Value; /該參數(shù)是返回值該參數(shù)是返回值 cmd.Parameterscmd.Parametersiid.Value = 1; d.Value = 1; /為參數(shù)初始化為參數(shù)初始化 cmd.Parameterscmd.Parameters“title“title”.Value = null; ”.Value = null; /為參數(shù)初始化為參數(shù)初始化 cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery(); /執(zhí)行存儲(chǔ)過(guò)程執(zhí)行存儲(chǔ)過(guò)程 /獲取返回值獲取返回值 Label1.Text = cmd.ParametersLabel1.Text = cmd.Par
60、ameterscountcount.Value.ToString(); .Value.ToString(); 第9章ASPNET操作數(shù)據(jù)庫(kù)29 使用控件,能夠方便開(kāi)發(fā)人員的開(kāi)發(fā)和使用,但是很多情況下,不能使用控件,能夠方便開(kāi)發(fā)人員的開(kāi)發(fā)和使用,但是很多情況下,不能 使用控件來(lái)實(shí)現(xiàn),所以很多情況都需要使用使用控件來(lái)實(shí)現(xiàn),所以很多情況都需要使用 ADO.NET ADO.NET 操作數(shù)據(jù)庫(kù)中操作數(shù)據(jù)庫(kù)中 的數(shù)據(jù)。的數(shù)據(jù)。 SQLHelper SQLHelper 是將是將 ADO.NET ADO.NET 中對(duì)數(shù)據(jù)操作的類和對(duì)象進(jìn)行的封裝的一中對(duì)數(shù)據(jù)操作的類和對(duì)象進(jìn)行的封裝的一 個(gè)類庫(kù),使用個(gè)類庫(kù),使用
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- STEAM理念下的高中地理教學(xué)研究
- 任務(wù)期限合同范例
- 代收房產(chǎn)貸款合同范例
- 排污泵施工方案
- 代理債務(wù)合同范例范例
- 伐木買(mǎi)賣合同范本
- 付款轉(zhuǎn)讓協(xié)議合同范例
- LCL型并網(wǎng)逆變器解耦和諧波抑制策略的研究
- 耦合計(jì)算機(jī)視覺(jué)及高精度雨洪數(shù)值模擬的城市內(nèi)澇實(shí)時(shí)減災(zāi)研究
- 加盟商合同范例
- 2025年湖南水利水電職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)參考答案
- (部編版2025新教材)道德與法治一年級(jí)下冊(cè)-第1課《有個(gè)新目標(biāo)》課件
- 臨床基于高級(jí)健康評(píng)估的高血壓Ⅲ級(jí)合并腦梗死患者康復(fù)個(gè)案護(hù)理
- 2024年湖北省聯(lián)合發(fā)展投資集團(tuán)有限公司人員招聘考試題庫(kù)及答案解析
- 2024年全國(guó)統(tǒng)一高考英語(yǔ)試卷(新課標(biāo)Ⅰ卷)含答案
- DB13(J)T 8359-2020 被動(dòng)式超低能耗居住建筑節(jié)能設(shè)計(jì)標(biāo)準(zhǔn)(2021年版)
- T∕ACSC 01-2022 輔助生殖醫(yī)學(xué)中心建設(shè)標(biāo)準(zhǔn)(高清最新版)
- 《當(dāng)代廣播電視概論》試題A卷及答案
- DELL-PS系列存儲(chǔ)安裝手冊(cè)
- 聲學(xué)原理及聲學(xué)測(cè)試
- 淺談如何培養(yǎng)中學(xué)生的體育學(xué)習(xí)動(dòng)機(jī)
評(píng)論
0/150
提交評(píng)論