數(shù)據(jù)庫訪問技術(shù)ADO NET_第1頁
數(shù)據(jù)庫訪問技術(shù)ADO NET_第2頁
數(shù)據(jù)庫訪問技術(shù)ADO NET_第3頁
數(shù)據(jù)庫訪問技術(shù)ADO NET_第4頁
數(shù)據(jù)庫訪問技術(shù)ADO NET_第5頁
已閱讀5頁,還剩69頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 常用格式:常用格式:Select * from 表名表名 Where 條件條件模糊查詢:模糊查詢:Select * from 表名表名 Where 字段名字段名 like %條件條件%ConnectionConnection對象對象CommandCommand對象對象DataReaderDataReader對象對象DataAdapterDataAdapter對象對象DataSetDataSet對象對象 數(shù)據(jù)集數(shù)據(jù)集數(shù)據(jù)提供器數(shù)據(jù)提供器準(zhǔn)確地說,準(zhǔn)確地說,ADO.NET是由很多類組成的一個(gè)類庫。是由很多類組成的一個(gè)類庫。這些類提供了眾多對象,分別用來完成和數(shù)據(jù)庫的這些類提供了眾多對象,分別用來

2、完成和數(shù)據(jù)庫的連接、查詢、插入、更新和刪除等操作。其中主要連接、查詢、插入、更新和刪除等操作。其中主要包括包括5個(gè)個(gè)對象。對象。82022-3-221. Connection對象:用來連接到數(shù)據(jù)庫。對象:用來連接到數(shù)據(jù)庫。2. Command對象:用來對數(shù)據(jù)庫執(zhí)行對象:用來對數(shù)據(jù)庫執(zhí)行 SQL命令。命令。3. DataReader對象:用來從數(shù)據(jù)庫返回只讀數(shù)據(jù)。對象:用來從數(shù)據(jù)庫返回只讀數(shù)據(jù)。4. DataAdapter對象:用來從數(shù)據(jù)庫返回?cái)?shù)據(jù),并送對象:用來從數(shù)據(jù)庫返回?cái)?shù)據(jù),并送到到 Dataset對象中,還要負(fù)責(zé)保證對象中,還要負(fù)責(zé)保證Dataset對象中的對象中的數(shù)據(jù)和數(shù)據(jù)庫中的數(shù)據(jù)保

3、持一致。數(shù)據(jù)和數(shù)據(jù)庫中的數(shù)據(jù)保持一致。5. DataSet對象:它可以看做是內(nèi)存中的數(shù)據(jù)庫。利用對象:它可以看做是內(nèi)存中的數(shù)據(jù)庫。利用 DataAdapter對象將數(shù)據(jù)庫中的數(shù)據(jù)送到該對象中,對象將數(shù)據(jù)庫中的數(shù)據(jù)送到該對象中,然后就可以在其中對數(shù)據(jù)進(jìn)行各種操作,最后再利然后就可以在其中對數(shù)據(jù)進(jìn)行各種操作,最后再利用用DataAdapter對象將更新反映到數(shù)據(jù)庫中。對象將更新反映到數(shù)據(jù)庫中。92022-3-22這這5個(gè)對象提供了兩種讀取數(shù)據(jù)庫的方式。一種是個(gè)對象提供了兩種讀取數(shù)據(jù)庫的方式。一種是利用利用Connetction、Command和和 DataReader對象,對象,這種方式這種方式只

4、能讀取數(shù)據(jù)庫只能讀取數(shù)據(jù)庫,也就是說不能修改記錄。,也就是說不能修改記錄。如果只是想查詢記錄的話,這種方式的效率更高些。如果只是想查詢記錄的話,這種方式的效率更高些。 (保持連接模式)(保持連接模式)第二種是利用第二種是利用Connection、Command、DataAdapter和和Dataset對象,這種方式更靈活,可對象,這種方式更靈活,可以對數(shù)據(jù)庫進(jìn)行各種操作。以對數(shù)據(jù)庫進(jìn)行各種操作。 (斷開連接模式)(斷開連接模式)102022-3-22112022-3-22針對不同的數(shù)據(jù)庫,針對不同的數(shù)據(jù)庫,ADO.NET提供了兩套類庫:提供了兩套類庫:第一套類庫可以存取所有基于第一套類庫可以存

5、取所有基于 OLEDB提供的提供的數(shù)據(jù)庫,如數(shù)據(jù)庫,如 SQL Server、Access、Oracle等;等;第二套類庫專門用來存取第二套類庫專門用來存取 SQL Server數(shù)據(jù)庫。數(shù)據(jù)庫。只對只對SQL Server7.0及更及更高版高版SQL Server數(shù)據(jù)庫數(shù)據(jù)庫進(jìn)行高度優(yōu)化連接進(jìn)行高度優(yōu)化連接122022-3-22對應(yīng)命名空間對應(yīng)命名空間System.Data.OleDbSystem.Data.SqlClient對象對象OLEDBOLEDB數(shù)據(jù)庫數(shù)據(jù)庫SQL ServerSQL Server數(shù)據(jù)庫數(shù)據(jù)庫ConnectionOLEDBConnectionOLEDBConnectio

6、nSQLConnectionSQLConnectionCommandOLEDBCommandOLEDBCommandSQLCommandSQLCommandDataReaderOLEDBDataReaderOLEDBDataReaderSQLDataReaderSQLDataReaderDataAdapterOLEDBDataAdapterOLEDBDataAdapterSQLDataAdapterSQLDataAdapterDataSetDataSetDataSetSQLDataSetSQLDataSet132022-3-22 如果要使用基于如果要使用基于 OLEDB的數(shù)據(jù)庫,需要在頁面中的

7、數(shù)據(jù)庫,需要在頁面中導(dǎo)入相關(guān)的導(dǎo)入相關(guān)的,語法如下:,語法如下: using System.Data; using System.Data.Oledb;l如果要使用如果要使用 SQL Server數(shù)據(jù)庫,則語句需要改為數(shù)據(jù)庫,則語句需要改為: using System.Data; using System.Data.SqlClient;142022-3-22Connection對象提供與數(shù)據(jù)源的連接。要存取數(shù)據(jù)源對象提供與數(shù)據(jù)源的連接。要存取數(shù)據(jù)源內(nèi)的數(shù)據(jù),首先要建立程序和數(shù)據(jù)源之間的連接。內(nèi)的數(shù)據(jù),首先要建立程序和數(shù)據(jù)源之間的連接。(1)ConnectionString:獲取或設(shè)置用于打開數(shù)

8、據(jù)庫:獲取或設(shè)置用于打開數(shù)據(jù)庫的字符串,包括的字符串,包括(2)State:獲取連接的當(dāng)前狀態(tài)獲取連接的當(dāng)前狀態(tài)(1)Open()方法:用于打開由()方法:用于打開由ConnectionString屬性指定的數(shù)據(jù)源連接屬性指定的數(shù)據(jù)源連接(2)Close()方法:關(guān)閉數(shù)據(jù)源連接()方法:關(guān)閉數(shù)據(jù)源連接創(chuàng)建一個(gè)新創(chuàng)建一個(gè)新Connection對象對象OleDbConnection conn=new OleDbConnection();SqlConnection conn=new SqlConnection();設(shè)置設(shè)置Connection對象的連接字符串屬性對象的連接字符串屬性打開或關(guān)閉數(shù)據(jù)庫連

9、接打開或關(guān)閉數(shù)據(jù)庫連接用于連接用于連接Access數(shù)據(jù)數(shù)據(jù)庫的對象庫的對象用于連接用于連接SQL數(shù)據(jù)庫數(shù)據(jù)庫的對象的對象 為了連接到數(shù)據(jù)源,需要一個(gè)連接字符串。連接為了連接到數(shù)據(jù)源,需要一個(gè)連接字符串。連接字符串通常由字符串通常由分號分號隔開的名稱和值組成隔開的名稱和值組成,它指定數(shù),它指定數(shù)據(jù)庫運(yùn)行庫的設(shè)置。連接字符串中包含的典型信息據(jù)庫運(yùn)行庫的設(shè)置。連接字符串中包含的典型信息包括包括數(shù)據(jù)庫的名稱、服務(wù)器的位置和用戶的身份。數(shù)據(jù)庫的名稱、服務(wù)器的位置和用戶的身份。下面以連接下面以連接AccessAccess數(shù)據(jù)庫和數(shù)據(jù)庫和SQL ServerSQL Server數(shù)據(jù)庫為數(shù)據(jù)庫為例說明。例說明

10、。程序員可以方便地程序員可以方便地更改服務(wù)器名稱、更改服務(wù)器名稱、數(shù)據(jù)庫或身份驗(yàn)證數(shù)據(jù)庫或身份驗(yàn)證信息,而無須逐個(gè)信息,而無須逐個(gè)修改程序。修改程序。172022-3-22OleDbConnection類的類的Connectionstrings屬性所要求的屬性所要求的字符串的內(nèi)容也是由若干個(gè)字符串的內(nèi)容也是由若干個(gè)以分號隔開以分號隔開的的 “參數(shù)名參數(shù)名參數(shù)值參數(shù)值”表示的子串組成。如:表示的子串組成。如: conn.ConnectionString = Provider=Microsoft.Jet.Oledb.4.0; + Data Source= + Server.MapPath(App_

11、Data/xxx.mdb);以上字符串說明了連接以上字符串說明了連接 Access數(shù)據(jù)庫的方法。數(shù)據(jù)庫的方法。Conn.ConectionStringConn.ConectionString =Data Source=.SQLEXPRESS; =Data Source=.SQLEXPRESS; AttachDbFilename=|DataDirectory|AttachDbFilename=|DataDirectory|* *.mdf;.mdf; Integrated Security=True; Integrated Security=True; User Instance=True Use

12、r Instance=True 192022-3-22連接連接SQL Server數(shù)據(jù)庫的機(jī)制與連接數(shù)據(jù)庫的機(jī)制與連接Access的機(jī)制的機(jī)制沒有什么太大的區(qū)別沒有什么太大的區(qū)別,只是改變了只是改變了Connection對象和對象和連接字符串中的不同參數(shù)。連接字符串中的不同參數(shù)。首先首先,連接連接SQL Server使用的命名空間不是使用的命名空間不是“System.Data.OleDb”,而是而是“System.Data.SqlClient”。202022-3-22server=.SQLEXPRESS,表示使用的是本地表示使用的是本地?cái)?shù)據(jù)數(shù)據(jù)庫庫且定義了實(shí)例名;如果是遠(yuǎn)程且定義了實(shí)例名;如果

13、是遠(yuǎn)程服務(wù)器服務(wù)器,則將則將“.”替替換為遠(yuǎn)程換為遠(yuǎn)程服務(wù)器服務(wù)器的名稱或的名稱或IP地址。地址。conn.ConnectionString = “server=xx;database=數(shù)據(jù)數(shù)據(jù)庫名庫名;uid=sa;pwd=密碼密碼; 注意:在連接注意:在連接SQL Server 2005時(shí),時(shí),server參數(shù)寫為:參數(shù)寫為:server= .SQLEXPRESS;連接字符串指明要連接哪臺服務(wù)器上的、哪個(gè)實(shí)連接字符串指明要連接哪臺服務(wù)器上的、哪個(gè)實(shí)例的哪個(gè)數(shù)據(jù)庫,所用用戶名及密碼等信息。例的哪個(gè)數(shù)據(jù)庫,所用用戶名及密碼等信息。 下面以查詢下面以查詢student表數(shù)據(jù)為例介紹如何打開和關(guān)閉

14、數(shù)據(jù)庫。表數(shù)據(jù)為例介紹如何打開和關(guān)閉數(shù)據(jù)庫。代碼如下。代碼如下。 protected void Page_Load(object sender, EventArgs e)/數(shù)據(jù)庫名為數(shù)據(jù)庫名為stu,用戶名為用戶名為sa,用戶密碼為空用戶密碼為空SqlConnection conn = new SqlConnection(); String strCon = server=.;database=stu;uid=sa;pwd=;conn.Connectionstring=strCon; conn.Open();/打開數(shù)據(jù)庫連接打開數(shù)據(jù)庫連接SqlCommand cmd = new SqlComm

15、and(select * from student, conn);/查詢學(xué)生信息表查詢學(xué)生信息表conn.Close();/關(guān)閉數(shù)據(jù)庫連接關(guān)閉數(shù)據(jù)庫連接 上述是典型的數(shù)據(jù)庫連接代碼,常在上述是典型的數(shù)據(jù)庫連接代碼,常在Web.Config文件中存文件中存放數(shù)據(jù)庫的連接信息。放數(shù)據(jù)庫的連接信息。 將數(shù)據(jù)庫連接字符串存放在應(yīng)用程序的配置文件將數(shù)據(jù)庫連接字符串存放在應(yīng)用程序的配置文件(即(即Web.Config)中,代碼如下。)中,代碼如下。 在程序中獲得在程序中獲得連接字符串的方法如下:連接字符串的方法如下: conn.ConnectionString =System.Configuration.

16、ConfigurationManager. ConnectionStringsconstr2.ToString();連接字連接字符串名符串名ASP.NET 應(yīng)用程序?qū)?yīng)用程序?qū)?|DataDirectory| 解析為解析為“/app_data”文件夾。文件夾。 在創(chuàng)建數(shù)據(jù)庫連接時(shí),建議使用在創(chuàng)建數(shù)據(jù)庫連接時(shí),建議使用Using語句塊語句塊;其作用為其作用為:定義一個(gè):定義一個(gè)范圍范圍,在范圍結(jié)束時(shí)處理對象,在范圍結(jié)束時(shí)處理對象(當(dāng)離開包含的代碼段時(shí)自動調(diào)用該類實(shí)例的(當(dāng)離開包含的代碼段時(shí)自動調(diào)用該類實(shí)例的Dispose()方法,自動關(guān)閉數(shù)據(jù)庫連接且釋放連()方法,自動關(guān)閉數(shù)據(jù)庫連接且釋放連接所

17、使用的資源);接所使用的資源); 如果需要使用一個(gè)對象,這個(gè)對象需要占用很多如果需要使用一個(gè)對象,這個(gè)對象需要占用很多緊缺的資源,使用完成后需要馬上釋放掉的話,建緊缺的資源,使用完成后需要馬上釋放掉的話,建議使用議使用using語句;語句; 優(yōu)勢優(yōu)勢:可以避免資源釋放不及時(shí)導(dǎo)致的沖突或性:可以避免資源釋放不及時(shí)導(dǎo)致的沖突或性能問題。能問題。 using (SqlConnection conn=new SqlConnection() )using (SqlConnection conn=new SqlConnection() ) conn.ConnectionString conn.Connec

18、tionString=“”=“”; conn.Open(); conn.Open(); 252022-3-22Command對象最主要的工作是通過對象最主要的工作是通過Connection對象對象對數(shù)據(jù)源下達(dá)對數(shù)據(jù)源下達(dá)操作數(shù)據(jù)庫操作數(shù)據(jù)庫的命令。使用戶能夠訪問的命令。使用戶能夠訪問用于返回?cái)?shù)據(jù)、修改數(shù)據(jù)運(yùn)行存儲過程以及發(fā)送或用于返回?cái)?shù)據(jù)、修改數(shù)據(jù)運(yùn)行存儲過程以及發(fā)送或檢索參數(shù)信息的數(shù)據(jù)庫命令。檢索參數(shù)信息的數(shù)據(jù)庫命令。 下列語法產(chǎn)生下列語法產(chǎn)生 Command對象:對象:SqlCommand com = new SqlCommand(string ,conn); );要執(zhí)行的要執(zhí)行的SQLS

19、QL語句語句已建立的已建立的Connection對象對象272022-3-22ExecuteNonQuery:執(zhí)行不返回任何行的命令。:執(zhí)行不返回任何行的命令。典型的例子是實(shí)現(xiàn)典型的例子是實(shí)現(xiàn)插入、更新和刪除插入、更新和刪除。 ExecuteReader:通過:通過Connection對象下達(dá)命令至對象下達(dá)命令至數(shù)據(jù)源,將數(shù)據(jù)作為一個(gè)數(shù)據(jù)源,將數(shù)據(jù)作為一個(gè) DataReader 對象返回。對象返回。用于任何返回?cái)?shù)據(jù)的用于任何返回?cái)?shù)據(jù)的 SQL 查詢;查詢; ExecuteScalar:從數(shù)據(jù)庫中返回單獨(dú)值,例如與:從數(shù)據(jù)庫中返回單獨(dú)值,例如與特定查詢相匹配的記錄數(shù),或者數(shù)據(jù)庫功能調(diào)用特定查詢相

20、匹配的記錄數(shù),或者數(shù)據(jù)庫功能調(diào)用的結(jié)果。的結(jié)果。 ExecuteNonQuery方法執(zhí)行更新操作,諸如那些與方法執(zhí)行更新操作,諸如那些與UPDATE、INSERT和和DELETE語句有關(guān)的操作,語句有關(guān)的操作,該方法返回一個(gè)整型(該方法返回一個(gè)整型(Integer)數(shù)據(jù),返回值是命)數(shù)據(jù),返回值是命令影響的行數(shù)。令影響的行數(shù)。例如,創(chuàng)建一個(gè)例如,創(chuàng)建一個(gè)SqlCommand,然后使用,然后使用ExecuteNonQuery方法執(zhí)行方法執(zhí)行SQL語句,如:語句,如:UPDATE、INSERT或或DELETE?!纠纠?】 使用使用ExecuteNonQuery方法向數(shù)據(jù)庫中插方法向數(shù)據(jù)庫中插入記

21、錄。入記錄。 ExecuteReader方法通常與查詢命令一起使用,并方法通常與查詢命令一起使用,并且返回一個(gè)數(shù)據(jù)閱讀器對象且返回一個(gè)數(shù)據(jù)閱讀器對象DataReader,該對象連,該對象連接到數(shù)據(jù)庫的結(jié)果集上,并允許行檢索。接到數(shù)據(jù)庫的結(jié)果集上,并允許行檢索。數(shù)據(jù)閱讀器是一種只讀的、向前移動的游標(biāo),客戶數(shù)據(jù)閱讀器是一種只讀的、向前移動的游標(biāo),客戶端代碼滾動游標(biāo)并從中讀取數(shù)據(jù)。如果通過端代碼滾動游標(biāo)并從中讀取數(shù)據(jù)。如果通過ExecuteReader方法執(zhí)行一個(gè)更新語句方法執(zhí)行一個(gè)更新語句,則該命令,則該命令成功地執(zhí)行,但是不會返回任何受影響的數(shù)據(jù)行。成功地執(zhí)行,但是不會返回任何受影響的數(shù)據(jù)行。

22、SqlCommand com = new SqlCommand(queryString, connection);/通過通過ExecuteReader方法創(chuàng)建方法創(chuàng)建DataReader對象對象SqlDataReader dr = com.ExecuteReader();if (dr.Read() / else / 使用使用DataReader對象中的對象中的Read方法用來遍歷整個(gè)結(jié)果集,不需方法用來遍歷整個(gè)結(jié)果集,不需要顯式地向前移動指針,或者檢要顯式地向前移動指針,或者檢查文件的結(jié)束,如果沒有要讀取查文件的結(jié)束,如果沒有要讀取的記錄了,則的記錄了,則Read方法會自動返方法會自動返回回F

23、alse?!纠纠?】 使用使用ExecuteReader方法將性別為方法將性別為“女女”性性的記錄顯示在的記錄顯示在GridView控件中??丶?。執(zhí)行查詢,并返回結(jié)果集中執(zhí)行查詢,并返回結(jié)果集中第一行的第一列的值。第一行的第一列的值。如果只想檢索數(shù)據(jù)庫信息中的一個(gè)值,而不需要返如果只想檢索數(shù)據(jù)庫信息中的一個(gè)值,而不需要返回表或數(shù)據(jù)流形式的數(shù)據(jù)庫信息。回表或數(shù)據(jù)流形式的數(shù)據(jù)庫信息。例如,只需要返例如,只需要返回回 COUNT(*)、SUM( ) 或或 AVG( ) 等函數(shù)的結(jié)果等函數(shù)的結(jié)果,那么那么Command對象的對象的ExecuteScalar方法就很有用。方法就很有用。如果在一個(gè)常規(guī)

24、查詢語句當(dāng)中調(diào)用該方法,則只讀如果在一個(gè)常規(guī)查詢語句當(dāng)中調(diào)用該方法,則只讀取第一行第一列的值,而丟棄所有其他值。取第一行第一列的值,而丟棄所有其他值。在數(shù)據(jù)庫在數(shù)據(jù)庫Colledge.mdb中,有一個(gè)中,有一個(gè)teacher表如下表如下所示:所示:窗體上有一文本框(名稱為窗體上有一文本框(名稱為TextBox1)TextBox1)和一命令按鈕和一命令按鈕( (名稱名稱為為Button1)Button1),有如下代碼:,有如下代碼: OleDbConnection conn = new OleDbConnection();OleDbConnection conn = new OleDbConne

25、ction(); conn.ConnectionString = conn.ConnectionString = Provider=Microsoft.Jet.Oledb.4.0; + Data Source= Provider=Microsoft.Jet.Oledb.4.0; + Data Source= + Server.MapPath(App_Data/Colledge.mdb);+ Server.MapPath(App_Data/Colledge.mdb); conn.Open(); conn.Open(); string sql = select count( string sql

26、= select count(* *) from teacher where ) from teacher where 年年齡齡35;35;/string sql = select /string sql = select * * from teacher where from teacher where 年齡年齡35; 35; /常規(guī)查詢,返回結(jié)果集中第常規(guī)查詢,返回結(jié)果集中第1 1行第行第1 1列的值列的值 OleDbCommand com = new OleDbCommand(sql, conn); OleDbCommand com = new OleDbCommand(sql, con

27、n); TextBox1.Text = com.ExecuteScalar().ToString(); TextBox1.Text = com.ExecuteScalar().ToString(); conn.Close();conn.Close();程序執(zhí)行后,文本框顯示的內(nèi)容?程序執(zhí)行后,文本框顯示的內(nèi)容?當(dāng)當(dāng)Command 對象返回結(jié)果集時(shí),需要使用對象返回結(jié)果集時(shí),需要使用DataReader對象來檢索數(shù)據(jù)。對象來檢索數(shù)據(jù)。DataReader 對象返對象返回一個(gè)來自回一個(gè)來自Command 的只讀的、只能向前的數(shù)據(jù)的只讀的、只能向前的數(shù)據(jù)流。流。DataReader每次只能在內(nèi)存中保

28、留一行,所以每次只能在內(nèi)存中保留一行,所以開銷非常小。開銷非常小。在與數(shù)據(jù)庫的交互中,要獲得數(shù)據(jù)訪問的結(jié)果可在與數(shù)據(jù)庫的交互中,要獲得數(shù)據(jù)訪問的結(jié)果可用用兩種兩種方法來實(shí)現(xiàn),第一種是通過方法來實(shí)現(xiàn),第一種是通過DataReader對對象從數(shù)據(jù)源中獲取數(shù)據(jù)并進(jìn)行處理;第二種是通象從數(shù)據(jù)源中獲取數(shù)據(jù)并進(jìn)行處理;第二種是通過過DataSet對象將數(shù)據(jù)放置在內(nèi)存中進(jìn)行處理。對象將數(shù)據(jù)放置在內(nèi)存中進(jìn)行處理。DataReader對象常用方法對象常用方法注意:注意:DataReader對象不能用對象不能用new運(yùn)算符生成,運(yùn)算符生成,只能使用只能使用Command對象的對象的ExecuteReader()方

29、法方法來創(chuàng)建。來創(chuàng)建。SqlCommand cmd= new SqlCommand( SELECT *FROM Customers ,conn); /查詢查詢Customers表表SqlDataReader dr=cmd.ExecuteReader();While(dr.Read() /循環(huán)讀取數(shù)據(jù)循環(huán)讀取數(shù)據(jù) dr.Close(); /關(guān)閉關(guān)閉DataReader對象對象在數(shù)據(jù)庫在數(shù)據(jù)庫Colledge.mdb中,有一個(gè)中,有一個(gè)teacher表,如表所示。表,如表所示。在窗體上有一個(gè)按鈕(其在窗體上有一個(gè)按鈕(其ID為為Button1)和一個(gè)列表框(其)和一個(gè)列表框(其ID為為ListBo

30、x1)。程序運(yùn)行后,單擊命令按鈕,列表框中)。程序運(yùn)行后,單擊命令按鈕,列表框中的內(nèi)容是什么?的內(nèi)容是什么? OleDbConnection conn = new OleDbConnection(); conn.ConnectionString =Provider=Microsoft.Jet.Oledb.4.0; + Data Source= + Server.MapPath(App_Data/Colledge.mdb); conn.Open(); string strsql = select * from teacher where 姓名姓名 like %王王%; OleDbCommand

31、com = new OleDbCommand(strsql, conn); OleDbDataReader dr = com.ExecuteReader(); while (dr.Read() ListBox1 .Items .Add (dr姓名姓名.ToString(); conn.Close();獲取查詢結(jié)果獲取查詢結(jié)果中的中的”姓名姓名”字段值字段值上例中,用戶登錄時(shí)輸入任意用戶名,密碼為:上例中,用戶登錄時(shí)輸入任意用戶名,密碼為: 1 or 1=1則能夠成功登錄則能夠成功登錄分析:分析:形成的查詢語句為:形成的查詢語句為:select * from T_users where unam

32、e=dd and password=1 or 1=1 可見執(zhí)行可見執(zhí)行com.ExecuteReader()方法時(shí)會返回所有記錄方法時(shí)會返回所有記錄 當(dāng)應(yīng)用程序使用輸入內(nèi)容來構(gòu)造動態(tài)當(dāng)應(yīng)用程序使用輸入內(nèi)容來構(gòu)造動態(tài)sql語句以訪語句以訪問數(shù)據(jù)庫時(shí),會發(fā)生問數(shù)據(jù)庫時(shí),會發(fā)生sql注入攻擊注入攻擊 。使用二種方法均可參數(shù)化查詢是指在與參數(shù)化查詢是指在與數(shù)據(jù)庫數(shù)據(jù)庫連接并訪問數(shù)據(jù)時(shí),在連接并訪問數(shù)據(jù)時(shí),在需要填入數(shù)據(jù)的地方,使用參數(shù)需要填入數(shù)據(jù)的地方,使用參數(shù) (Parameter) 來給來給值,該方法可以有效預(yù)防值,該方法可以有效預(yù)防SQL注入攻擊注入攻擊 。原理:在使用參數(shù)化查詢的情況下,原理:

33、在使用參數(shù)化查詢的情況下,數(shù)據(jù)庫數(shù)據(jù)庫服務(wù)器服務(wù)器不會將參數(shù)的內(nèi)容視為不會將參數(shù)的內(nèi)容視為SQL指令的一部份來處理,指令的一部份來處理,而是在數(shù)據(jù)庫完成而是在數(shù)據(jù)庫完成 SQL 指令的編譯后,才套用參指令的編譯后,才套用參數(shù)運(yùn)行,因此即使參數(shù)中含有惡意的指令,由于已數(shù)運(yùn)行,因此即使參數(shù)中含有惡意的指令,由于已經(jīng)編譯完成,就不會被數(shù)據(jù)庫所運(yùn)行。經(jīng)編譯完成,就不會被數(shù)據(jù)庫所運(yùn)行。Microsoft SQL Server 的參數(shù)格式是以的參數(shù)格式是以 “” 字符字符加上參數(shù)名稱而構(gòu)成。加上參數(shù)名稱而構(gòu)成。 SELECT SELECT * * FROM myTable WHERE myID = myI

34、D FROM myTable WHERE myID = myID INSERT INTO INSERT INTO 表表 (c1, c2, c3) VALUES (c1, c2, c3) (c1, c2, c3) VALUES (c1, c2, c3) com.Parameters.Add(“c1”, 值值1); / 設(shè)定參數(shù)設(shè)定參數(shù) c1 的值。的值。 com.Parameters.Add(“c2”, 值值2); / 設(shè)定參數(shù)設(shè)定參數(shù) c2 的值。的值。 com.Parameters.Add (“c3”, 值值3); / 設(shè)定參數(shù)設(shè)定參數(shù) c3 的值。的值。 作用:使用作用:使用conn建立的

35、數(shù)據(jù)連接,執(zhí)行建立的數(shù)據(jù)連接,執(zhí)行StrSel表示的表示的SQL語句。語句。例如:例如:string strsql = “select * from 表表 ;SqlCommand com=new SqlCommand (strsql ,conn); SqlDataAdapter da = new SqlDataAdapter();da.SelectCommand = com; Fill Fill 方法使用方法使用 SELECT SELECT 語句從數(shù)據(jù)源中檢索數(shù)語句從數(shù)據(jù)源中檢索數(shù)據(jù)。與據(jù)。與 Select Select 命令關(guān)聯(lián)的命令關(guān)聯(lián)的 Connection Connection 對象必

36、須有對象必須有效,效,但不需要將其打開但不需要將其打開。如果。如果 Fill Fill 方法發(fā)現(xiàn)連方法發(fā)現(xiàn)連接尚未打開,它將隱式地打開接尚未打開,它將隱式地打開 DataAdapterDataAdapter 正正在使用的在使用的 Connection Connection,然后再將其關(guān)閉。如果調(diào),然后再將其關(guān)閉。如果調(diào)用用 Fill Fill 之前連接已打開,它將保持打開狀態(tài)。之前連接已打開,它將保持打開狀態(tài)。1.創(chuàng)建數(shù)據(jù)庫連接對象創(chuàng)建數(shù)據(jù)庫連接對象Connection;2.創(chuàng)建創(chuàng)建Select查詢語句或查詢語句或Command對象;對象;3.創(chuàng)建創(chuàng)建DataAdapter對象;對象;4.創(chuàng)建

37、創(chuàng)建DataSet對象;對象;5.為為DataAdapter對象自動生成更新命令;對象自動生成更新命令;6.調(diào)用調(diào)用DataAdapter對象的對象的Fill()方法填充方法填充DataSet對象;對象;7.對對DataTable中的特定記錄進(jìn)行增加、刪除、修改中的特定記錄進(jìn)行增加、刪除、修改8. 調(diào)用調(diào)用DataAdapter對象的對象的Update()方法,將()方法,將DataTable中中的數(shù)據(jù)變化提交到數(shù)據(jù)庫。的數(shù)據(jù)變化提交到數(shù)據(jù)庫。說明:說明:當(dāng)調(diào)用當(dāng)調(diào)用Update方法時(shí),方法時(shí),DataAdapter將分析已做出的更將分析已做出的更改并執(zhí)行相應(yīng)的命令(改并執(zhí)行相應(yīng)的命令(Ins

38、ert,Update,Delete)。)。 OleDbConnection conn = new OleDbConnection(); conn.ConnectionString = Provider=Microsoft.Jet.OleDb.4.0; + Data Source= +Server.MapPath(App_Data/Student.mdb); string SqlStr=select * from grade; OleDbCommand com = new OleDbCommand(SqlStr, conn); OleDbDataAdapter da = new OleDbDat

39、aAdapter(); da.SelectCommand = com; DataTable dt = new DataTable(); OleDbCommandBuilder builder = new OleDbCommandBuilder(da); da.Fill(dt); DataRow myrow = dt.Rows0; myrow1 = 王麗王麗; myrow2 = 男男; myrow6 = 88; da.Update(dt);FDataAdapter對象對象.Update(數(shù)據(jù)集對象數(shù)據(jù)集對象,數(shù)據(jù)表名數(shù)據(jù)表名);FSqlCommandBuilder 對象名對象名=new SqlC

40、ommandBuilder(已創(chuàng)建的已創(chuàng)建的DataAdapter對象對象);DataSet相當(dāng)于內(nèi)存中的數(shù)據(jù)庫,在命名空間相當(dāng)于內(nèi)存中的數(shù)據(jù)庫,在命名空間System.Data中定義;中定義;DataAdapter相當(dāng)于相當(dāng)于DataSet和物理數(shù)據(jù)源之間的橋梁。和物理數(shù)據(jù)源之間的橋梁。在在DataSet內(nèi)部是一個(gè)或多個(gè)內(nèi)部是一個(gè)或多個(gè)DataTable的集合,的集合, DataSet.Tables“表名表名”可獲取數(shù)據(jù)集中的一個(gè)表。可獲取數(shù)據(jù)集中的一個(gè)表。 在在DataTable 中執(zhí)行的插入、更新和刪除操作中執(zhí)行的插入、更新和刪除操作并不并不會自動寫回?cái)?shù)據(jù)庫會自動寫回?cái)?shù)據(jù)庫。如果想把更改

41、寫回?cái)?shù)據(jù)庫,則。如果想把更改寫回?cái)?shù)據(jù)庫,則需要手動去完成,這個(gè)操作由需要手動去完成,這個(gè)操作由DataAdapter.UpdateDataAdapter.Update完成。完成。 斷開式斷開式ADO.NET數(shù)據(jù)庫訪問示例圖數(shù)據(jù)庫訪問示例圖提示提示: DataSet中的各種集合,訪問子項(xiàng)有兩種方法中的各種集合,訪問子項(xiàng)有兩種方法,一種是用子項(xiàng)的名,一種是用數(shù)字索引。如要訪問一種是用子項(xiàng)的名,一種是用數(shù)字索引。如要訪問表表”student”,可以用,可以用: DataSet.Tables“student”或或DataSet.Tables0 訪問訪問 (多張表依次類推多張表依次類推) 填充數(shù)據(jù)。第二

42、個(gè)參數(shù)是數(shù)據(jù)集填充數(shù)據(jù)。第二個(gè)參數(shù)是數(shù)據(jù)集中內(nèi)存表的名字,可以與數(shù)據(jù)庫中內(nèi)存表的名字,可以與數(shù)據(jù)庫中的表名不同。中的表名不同。窗體上有一按鈕(窗體上有一按鈕(ID為為Button1)和一數(shù)據(jù)顯示控件)和一數(shù)據(jù)顯示控件Gridview1 。運(yùn)行程序,單擊命令按鈕,運(yùn)行程序,單擊命令按鈕,Gridview1中顯示什么?中顯示什么? protected void Button1_Click(object sender, EventArgs e) OleDbConnection conn = new OleDbConnection(); conn.ConnectionString = Provider

43、=Microsoft.Jet.Oledb.4.0; + Data Source= + Server.MapPath(App_Data/Colledge.mdb); conn.Open(); string strsql = select * from teacher where 姓名姓名 like %王王%; OleDbCommand com=new OleDbCommand (strsql ,conn); OleDbDataAdapter da = new OleDbDataAdapter(); da.SelectCommand = com; DataSet ds = new DataSet(

44、); da.Fill(ds); GridView1.DataSource = ds; GridView1 .DataBind (); DataAdapterDataAdapter填填充數(shù)據(jù)到數(shù)據(jù)集充數(shù)據(jù)到數(shù)據(jù)集(DataSetDataSet)中)中填充數(shù)據(jù),填充數(shù)據(jù),F(xiàn)ill方法其實(shí)是隱方法其實(shí)是隱藏的執(zhí)行了命令對象藏的執(zhí)行了命令對象(Command)的查詢語句)的查詢語句protected void Button1_Click(object sender, EventArgs e)protected void Button1_Click(object sender, EventArgs e)

45、 SqlConnection conn = new SqlConnection(); SqlConnection conn = new SqlConnection(); conn.ConnectionString = conn.ConnectionString = ConfigurationManager.ConnectionStringsconstr.ToStrinConfigurationManager.ConnectionStringsconstr.ToString(); g(); string strsql = select string strsql = select * * fro

46、m T_student; from T_student; SqlDataAdapter da = new SqlDataAdapter(strsql,conn); SqlDataAdapter da = new SqlDataAdapter(strsql,conn); DataSet ds = new DataSet(); DataSet ds = new DataSet(); da.Fill(ds, student); da.Fill(ds, student); foreach (DataRow r in ds.Tablesstudent.Rows) foreach (DataRow r i

47、n ds.Tablesstudent.Rows) Response.Write(rsname.ToString() Response.Write(rsname.ToString()+);); DataSetDataSet 的結(jié)構(gòu)和數(shù)據(jù)庫相似,插入數(shù)據(jù)實(shí)質(zhì)上就是的結(jié)構(gòu)和數(shù)據(jù)庫相似,插入數(shù)據(jù)實(shí)質(zhì)上就是在在DataSetDataSet 的數(shù)據(jù)表里插入一行的數(shù)據(jù)表里插入一行(DataRow(DataRow) )/新建一行新建一行DataRow dr= ds.Tables“T_student”.NewRow();DataRow dr= ds.Tables“T_student”.NewRow();dr“s

48、nodr“sno”=100020;”=100020; dr “sname dr “sname” = “” = “李四李四”; ;/各字段賦值各字段賦值 dr “math” =88;dr “math” =88;ds.Tables“users”.Rows.Add(drds.Tables“users”.Rows.Add(dr); /); /將新建的將新建的行加到行加到DataTableDataTable 的的DataRowDataRow集合中集合中注意:注意:對對DataSetDataSet的操作僅僅是在的操作僅僅是在DataSetDataSet中執(zhí)行中執(zhí)行, ,并并不影響數(shù)據(jù)庫中的數(shù)據(jù)。不影響數(shù)據(jù)

49、庫中的數(shù)據(jù)。使用使用DataAdapterDataAdapter 的的 UpdateUpdate()方法可以將()方法可以將數(shù)據(jù)集中的結(jié)果更新回?cái)?shù)據(jù)源。數(shù)據(jù)集中的結(jié)果更新回?cái)?shù)據(jù)源。注意注意: DataAdapter: DataAdapter 對象在數(shù)據(jù)發(fā)生改變時(shí)對象在數(shù)據(jù)發(fā)生改變時(shí), ,并并不能自動產(chǎn)生數(shù)據(jù)庫系統(tǒng)所需的交易不能自動產(chǎn)生數(shù)據(jù)庫系統(tǒng)所需的交易sqlsql語句語句, ,所所有要建立一個(gè)有要建立一個(gè)CommandBuilderCommandBuilder 對象,它能自動對象,它能自動產(chǎn)生交易的產(chǎn)生交易的sqlsql語句。語句。OleDbCommandBuilder custcb = n

50、ew OleDbCommandBuilder custcb = new OleDbCommandBuilder(MyAdapterOleDbCommandBuilder(MyAdapter);); protected void Buprotected void BunDelnDel_Click(object sender, EventArgs e)_Click(object sender, EventArgs e) SqlConnection conn = new SqlConnection();SqlConnection conn = new SqlConnection();conn.Con

51、nectionString = conn.ConnectionString = ConfigurationManager.ConnectionStringsconstr.ToStrConfigurationManager.ConnectionStringsconstr.ToString();ing();SqlDataAdapter da = new SqlDataAdapter(select SqlDataAdapter da = new SqlDataAdapter(select * * from from T_student, conn);T_student, conn); DataSet

52、 ds = new DataSet();/ DataSet ds = new DataSet();/建立建立DataSetDataSet實(shí)例實(shí)例 /使用使用DataAdapterDataAdapter填充數(shù)據(jù)集填充數(shù)據(jù)集DataSetDataSet da.Fill(ds, student); da.Fill(ds, student); DataRow dr = ds.Tablesstudent.Rows2;DataRow dr = ds.Tablesstudent.Rows2; dr.Delete(); dr.Delete(); SqlCommandBuilder cb = new SqlCo

53、mmandBuilder(da); SqlCommandBuilder cb = new SqlCommandBuilder(da); da.Update(ds, student); da.Update(ds, student); 刪除記錄刪除記錄protected void Button4_Click(object sender, EventArgs e)protected void Button4_Click(object sender, EventArgs e) SqlConnection conn = new SqlConnection(); SqlConnection conn =

54、new SqlConnection(); conn.ConnectionString = conn.ConnectionString = ConfigurationManager.ConnectionStringsconstr.ToStConfigurationManager.ConnectionStringsconstr.ToString();ring(); SqlDataAdapter da = new SqlDataAdapter(select SqlDataAdapter da = new SqlDataAdapter(select * * from from T_Student, c

55、onn);T_Student, conn); DataSet ds = new DataSet();/ DataSet ds = new DataSet();/建立建立DataSetDataSet實(shí)例實(shí)例 /使用使用DataAdapterDataAdapter填充數(shù)據(jù)集填充數(shù)據(jù)集DataSetDataSet da.Fill(ds, student); da.Fill(ds, student); DataRow dr = ds.Tablesstudent.Rows0; DataRow dr = ds.Tablesstudent.Rows0; drsclass = drsclass = 網(wǎng)絡(luò)技術(shù)網(wǎng)

56、絡(luò)技術(shù)Z101;Z101; drmath = 99; drmath = 99; SqlCommandBuilder cb = new SqlCommandBuilder(da); SqlCommandBuilder cb = new SqlCommandBuilder(da); da.Update(ds, student); da.Update(ds, student); 修改記錄修改記錄當(dāng)在代碼里使用當(dāng)在代碼里使用DataAdapter對象獲得數(shù)據(jù)表的連對象獲得數(shù)據(jù)表的連接數(shù)據(jù)時(shí),如果表中數(shù)據(jù)有主鍵,就可以使用接數(shù)據(jù)時(shí),如果表中數(shù)據(jù)有主鍵,就可以使用CommandBuilder對象來自動為這

57、個(gè)對象來自動為這個(gè)DataAdapter對象對象隱形隱形地生成其他地生成其他3個(gè)個(gè)InsertCommand、DeleteCommand和和UpdateCommand 屬性。這樣,屬性。這樣,在修改數(shù)據(jù)后,就可以在修改數(shù)據(jù)后,就可以直接調(diào)用直接調(diào)用Update方法將修改方法將修改后的數(shù)據(jù)更新到數(shù)據(jù)庫中,而不必再使用后的數(shù)據(jù)更新到數(shù)據(jù)庫中,而不必再使用InsertCommand、DeleteCommand和和UpdateCommand這這3個(gè)屬性來執(zhí)行更新操作。個(gè)屬性來執(zhí)行更新操作。 OleDbConnection conn = new OleDbConnection(); conn.Conne

58、ctionString = Provider=Microsoft.Jet.Oledb.4.0; + Data Source= + Server.MapPath(App_Data/Colledge.mdb); conn.Open(); string strsql = select * from teacher; OleDbCommand com = new OleDbCommand(strsql, conn); OleDbDataAdapter da = new OleDbDataAdapter(); DataSet ds = new DataSet(); da.SelectCommand =

59、com; /與與sql命令對象綁定命令對象綁定 da.Fill(ds, teacher); DataRow newRow = ds.Tablesteacher.NewRow();/向向teacher表中插入一行表中插入一行 newRow編號編號 = TextBox1 .Text ; /該行的一列的值該行的一列的值 newRow姓名姓名 = TextBox2.Text ; /該行另外一列的值該行另外一列的值 newRow年齡年齡 = int.Parse (TextBox3 .Text ); newRow電話電話 = TextBox4 .Text ; newRow職稱職稱 = TextBox5.T

60、ext; ds.Tablesteacher.Rows.Add(newRow); OleDbCommandBuilder commandBuilder = new OleDbCommandBuilder(da); da.Update(ds, teacher); /用用DataAdapter的的Update方法將數(shù)據(jù)集寫回?cái)?shù)據(jù)源方法將數(shù)據(jù)集寫回?cái)?shù)據(jù)源 GridView1.DataSource = ds; /將數(shù)據(jù)集綁定到數(shù)據(jù)顯示控件將數(shù)據(jù)集綁定到數(shù)據(jù)顯示控件 GridView1.DataBind();使使用用 更更新新數(shù)數(shù)據(jù)據(jù)源源Update填充數(shù)據(jù)。第二個(gè)參數(shù)是數(shù)據(jù)填充數(shù)據(jù)。第二個(gè)參數(shù)是數(shù)據(jù)集中

溫馨提示

  • 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

提交評論