




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第8章章 ADO.NET數(shù)據(jù)訪(fǎng)問(wèn)數(shù)據(jù)訪(fǎng)問(wèn)8.1 ADO.NET概述概述8.2 建立數(shù)據(jù)庫(kù)連接建立數(shù)據(jù)庫(kù)連接Connection對(duì)象對(duì)象8.3 使用使用Command對(duì)象執(zhí)行數(shù)據(jù)庫(kù)命令對(duì)象執(zhí)行數(shù)據(jù)庫(kù)命令8.4 連線(xiàn)模式數(shù)據(jù)訪(fǎng)問(wèn)連線(xiàn)模式數(shù)據(jù)訪(fǎng)問(wèn)DataReader對(duì)象對(duì)象8.5 離線(xiàn)模式數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)離線(xiàn)模式數(shù)據(jù)庫(kù)訪(fǎng)問(wèn) 常用格式:常用格式:Select * from 表名表名 Where 條件條件模糊查詢(xún):模糊查詢(xún):Select * from 表名表名 Where 字段名字段名 like %條件條件%使用使用數(shù)據(jù)源控件和數(shù)據(jù)綁定控件數(shù)據(jù)源控件和數(shù)據(jù)綁定控件,幾乎無(wú)需編寫(xiě),幾乎無(wú)需編寫(xiě)任何代碼就可以實(shí)
2、現(xiàn)對(duì)數(shù)據(jù)庫(kù)的一般操作,但靈任何代碼就可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的一般操作,但靈活性差?;钚圆?。在在.NET中,除了可以使用控件完成數(shù)據(jù)庫(kù)的操作中,除了可以使用控件完成數(shù)據(jù)庫(kù)的操作外,還可以使用外,還可以使用ADO.NET技術(shù)技術(shù),通過(guò)編寫(xiě)代碼自,通過(guò)編寫(xiě)代碼自由地實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的各種操作。由地實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的各種操作。在在Microsoft的的.NET編程環(huán)境中使用的數(shù)據(jù)訪(fǎng)問(wèn)接編程環(huán)境中使用的數(shù)據(jù)訪(fǎng)問(wèn)接口技術(shù)口技術(shù)是是.NET Framework中不可缺少的一部分中不可缺少的一部分一組向一組向.NET程序員公開(kāi)數(shù)據(jù)訪(fǎng)問(wèn)服務(wù)的類(lèi)程序員公開(kāi)數(shù)據(jù)訪(fǎng)問(wèn)服務(wù)的類(lèi)提供了對(duì)關(guān)系數(shù)據(jù)、提供了對(duì)關(guān)系數(shù)據(jù)、XML和應(yīng)用程序數(shù)據(jù)
3、的訪(fǎng)問(wèn)和應(yīng)用程序數(shù)據(jù)的訪(fǎng)問(wèn)最大連接數(shù)是指數(shù)據(jù)庫(kù)能承受的最大連接數(shù)是指數(shù)據(jù)庫(kù)能承受的最大并發(fā)訪(fǎng)最大并發(fā)訪(fǎng)問(wèn)數(shù)量問(wèn)數(shù)量微軟在微軟在MSDN上對(duì)最大連接數(shù)的定義是:上對(duì)最大連接數(shù)的定義是:“默認(rèn)是默認(rèn)是0,代表不限制,但最大連接數(shù)是,代表不限制,但最大連接數(shù)是32767”。連線(xiàn)模式連線(xiàn)模式數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)(持久連接)數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)(持久連接)離線(xiàn)模式離線(xiàn)模式數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)(非持久連接)數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)(非持久連接)ConnectionConnection對(duì)象對(duì)象CommandCommand對(duì)象對(duì)象DataReaderDataReader對(duì)象對(duì)象DataAdapterDataAdapter對(duì)象對(duì)象DataSetDataS
4、et對(duì)象對(duì)象 數(shù)據(jù)集數(shù)據(jù)集數(shù)據(jù)提供器數(shù)據(jù)提供器準(zhǔn)確地說(shuō),準(zhǔn)確地說(shuō),ADO.NET是由很多類(lèi)組成的一個(gè)類(lèi)是由很多類(lèi)組成的一個(gè)類(lèi)庫(kù)。這些類(lèi)提供了眾多對(duì)象,分別用來(lái)完成和數(shù)據(jù)庫(kù)。這些類(lèi)提供了眾多對(duì)象,分別用來(lái)完成和數(shù)據(jù)庫(kù)的連接、查詢(xún)、插入、更新和刪除等操作。其中庫(kù)的連接、查詢(xún)、插入、更新和刪除等操作。其中主要包括主要包括5個(gè)個(gè)對(duì)象。對(duì)象。142022-4-14 Connection對(duì)象:用來(lái)對(duì)象:用來(lái)連接到數(shù)據(jù)庫(kù)連接到數(shù)據(jù)庫(kù)。 Command對(duì)象:用來(lái)對(duì)數(shù)據(jù)庫(kù)對(duì)象:用來(lái)對(duì)數(shù)據(jù)庫(kù)執(zhí)行執(zhí)行 SQL命令命令。 DataReader對(duì)象:用來(lái)從數(shù)據(jù)庫(kù)對(duì)象:用來(lái)從數(shù)據(jù)庫(kù)返回只讀數(shù)據(jù)返回只讀數(shù)據(jù)。 DataAd
5、apter對(duì)象:用來(lái)從數(shù)據(jù)庫(kù)返回?cái)?shù)據(jù),并送對(duì)象:用來(lái)從數(shù)據(jù)庫(kù)返回?cái)?shù)據(jù),并送到到 Dataset對(duì)象中,還要負(fù)責(zé)保證對(duì)象中,還要負(fù)責(zé)保證Dataset對(duì)象中的對(duì)象中的數(shù)據(jù)和數(shù)據(jù)庫(kù)中的數(shù)據(jù)保持一致。數(shù)據(jù)和數(shù)據(jù)庫(kù)中的數(shù)據(jù)保持一致。 DataSet對(duì)象:它可以看做是內(nèi)存中的數(shù)據(jù)庫(kù)。利用對(duì)象:它可以看做是內(nèi)存中的數(shù)據(jù)庫(kù)。利用 DataAdapter對(duì)象將數(shù)據(jù)庫(kù)中的數(shù)據(jù)送到該對(duì)象中,對(duì)象將數(shù)據(jù)庫(kù)中的數(shù)據(jù)送到該對(duì)象中,然后就可以在其中對(duì)數(shù)據(jù)進(jìn)行各種操作,最后再利然后就可以在其中對(duì)數(shù)據(jù)進(jìn)行各種操作,最后再利用用DataAdapter對(duì)象將更新反映到數(shù)據(jù)庫(kù)中。對(duì)象將更新反映到數(shù)據(jù)庫(kù)中。152022-4-14這這
6、5個(gè)對(duì)象提供了兩種讀取數(shù)據(jù)庫(kù)的方式。個(gè)對(duì)象提供了兩種讀取數(shù)據(jù)庫(kù)的方式。一種是利用一種是利用Connetction、Command和和 DataReader對(duì)象,如果只是想查詢(xún)記錄的話(huà),這種方式的效率對(duì)象,如果只是想查詢(xún)記錄的話(huà),這種方式的效率更高些。更高些。 (連線(xiàn)模式)(連線(xiàn)模式)第 二 種 是 利 用第 二 種 是 利 用 C o n n e c t i o n 、 C o m m a n d 、DataAdapter和和Dataset對(duì)象,這種方式更靈活,可對(duì)象,這種方式更靈活,可以 對(duì) 數(shù) 據(jù) 庫(kù) 進(jìn) 行 各 種 操 作 。以 對(duì) 數(shù) 據(jù) 庫(kù) 進(jìn) 行 各 種 操 作 。 ( 離 線(xiàn) 模
7、 式 )( 離 線(xiàn) 模 式 )162022-4-14172022-4-14n使用使用ADO.NET技術(shù)訪(fǎng)問(wèn)技術(shù)訪(fǎng)問(wèn)SQL Server數(shù)據(jù)庫(kù),需要導(dǎo)入數(shù)據(jù)庫(kù),需要導(dǎo)入命名空間:命名空間:System.Data.SqlClientn操作操作SQL Server 數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)的5個(gè)對(duì)象名及功能如下表所示:個(gè)對(duì)象名及功能如下表所示:對(duì)象對(duì)象SQL ServerSQL Server數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)功能功能ConnectionSqlConnectionSqlConnection連接數(shù)據(jù)庫(kù)連接數(shù)據(jù)庫(kù)CommandSqlCommandSqlCommand對(duì)數(shù)據(jù)庫(kù)執(zhí)行命令對(duì)數(shù)據(jù)庫(kù)執(zhí)行命令DataReaderSq
8、lDataReaderSqlDataReader返回只讀結(jié)果返回只讀結(jié)果DataAdapterSqlDataAdapterSqlDataAdapter數(shù)據(jù)適配器數(shù)據(jù)適配器DataSetDataSetDataSet支持離線(xiàn)模式支持離線(xiàn)模式182022-4-14Connection對(duì)象提供與數(shù)據(jù)源的連接。要存取數(shù)據(jù)源對(duì)象提供與數(shù)據(jù)源的連接。要存取數(shù)據(jù)源內(nèi)的數(shù)據(jù),首先要建立程序和數(shù)據(jù)源之間的連接。內(nèi)的數(shù)據(jù),首先要建立程序和數(shù)據(jù)源之間的連接。(1)ConnectionString:獲取或設(shè)置用于打開(kāi)數(shù)據(jù)庫(kù):獲取或設(shè)置用于打開(kāi)數(shù)據(jù)庫(kù)的字符串,包括的字符串,包括(2)State:獲取連接的當(dāng)前狀態(tài)獲取連接
9、的當(dāng)前狀態(tài)(1)Open()方法:用于打開(kāi)由()方法:用于打開(kāi)由ConnectionString屬性指定的數(shù)據(jù)源連接屬性指定的數(shù)據(jù)源連接(2)Close()方法:關(guān)閉數(shù)據(jù)源連接()方法:關(guān)閉數(shù)據(jù)源連接創(chuàng)建一個(gè)創(chuàng)建一個(gè)connection對(duì)象對(duì)象 SqlConnection conn=new SqlConnection();設(shè)置設(shè)置Connection對(duì)象的連接字符串屬性對(duì)象的連接字符串屬性 conn. ConnectionString=“”;打開(kāi)或關(guān)閉數(shù)據(jù)庫(kù)連接打開(kāi)或關(guān)閉數(shù)據(jù)庫(kù)連接 conn.Open(); 為了連接到數(shù)據(jù)源,需要一個(gè)連接字符串。連接為了連接到數(shù)據(jù)源,需要一個(gè)連接字符串。連接字
10、符串通常由字符串通常由分號(hào)分號(hào)隔開(kāi)的名稱(chēng)和值組成隔開(kāi)的名稱(chēng)和值組成,它指定數(shù),它指定數(shù)據(jù)庫(kù)運(yùn)行庫(kù)的設(shè)置。連接字符串中包含的典型信息據(jù)庫(kù)運(yùn)行庫(kù)的設(shè)置。連接字符串中包含的典型信息包括包括數(shù)據(jù)庫(kù)的名稱(chēng)、服務(wù)器的位置和用戶(hù)的身份。數(shù)據(jù)庫(kù)的名稱(chēng)、服務(wù)器的位置和用戶(hù)的身份。程序員可以方便地程序員可以方便地更改服務(wù)器名稱(chēng)、更改服務(wù)器名稱(chēng)、數(shù)據(jù)庫(kù)或身份驗(yàn)證數(shù)據(jù)庫(kù)或身份驗(yàn)證信息,而無(wú)須逐個(gè)信息,而無(wú)須逐個(gè)修改程序。修改程序。Conn.ConectionString Conn.ConectionString =Data Source=.SQLEXPRESS; =Data Source=.SQLEXPRESS; A
11、ttachDbFilename=|DataDirectory|AttachDbFilename=|DataDirectory|* *.mdf;.mdf; Integrated Security=True; Integrated Security=True; User Instance=True User Instance=True 下面以查詢(xún)下面以查詢(xún)student表數(shù)據(jù)為例介紹如何打開(kāi)和關(guān)閉數(shù)據(jù)庫(kù)。表數(shù)據(jù)為例介紹如何打開(kāi)和關(guān)閉數(shù)據(jù)庫(kù)。代碼如下。代碼如下。 protected void Page_Load(object sender, EventArgs e)SqlConnection con
12、n = new SqlConnection(); String strCon = Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory|Db.mdf;Integrated Security=True;User Instance=True;conn.Connectionstring=strCon; conn.Open();/打開(kāi)數(shù)據(jù)庫(kù)連接打開(kāi)數(shù)據(jù)庫(kù)連接/操作數(shù)據(jù)源操作數(shù)據(jù)源conn.Close();/關(guān)閉數(shù)據(jù)庫(kù)連接關(guān)閉數(shù)據(jù)庫(kù)連接 上述是典型的數(shù)據(jù)庫(kù)連接代碼,常在上述是典型的數(shù)據(jù)庫(kù)連接代碼,常在Web.Config文件中存放數(shù)文件中存放數(shù)據(jù)
13、庫(kù)的連接信息。據(jù)庫(kù)的連接信息。 將數(shù)據(jù)庫(kù)連接字符串存放在應(yīng)用程序的配置文件將數(shù)據(jù)庫(kù)連接字符串存放在應(yīng)用程序的配置文件(即(即Web.Config)中,代碼如下。)中,代碼如下。 add name=“連接字符串名連接字符串名” connectionString=“數(shù)數(shù)據(jù)庫(kù)的連接字符串據(jù)庫(kù)的連接字符串” providerName=“System.Data.SqlClient” 在程序中獲得在程序中獲得連接字符串的方法如下:連接字符串的方法如下: conn.ConnectionString =System.Configuration.ConfigurationManager. ConnectionS
14、tringsconstr2.ToString();連接字連接字符串名符串名 將數(shù)據(jù)庫(kù)連接字符串存放在新建的一個(gè)類(lèi)的方法中,例如可將此類(lèi)命名為將數(shù)據(jù)庫(kù)連接字符串存放在新建的一個(gè)類(lèi)的方法中,例如可將此類(lèi)命名為MyClass,并在這個(gè)類(lèi)中編寫(xiě)如下代碼。并在這個(gè)類(lèi)中編寫(xiě)如下代碼。public class MyClass private string constr =“ Data Source=.SQLEXPRESS; Data Source=.SQLEXPRESS; AttachDbFilename=|DataDirectory|AttachDbFilename=|DataDirectory|* *.
15、mdf;.mdf; Integrated Security=True;User Instance=True Integrated Security=True;User Instance=True public string strCon /定義為只讀屬性定義為只讀屬性 get return constr; 在引用此數(shù)據(jù)庫(kù)連接信息時(shí),首先要在應(yīng)用程序中創(chuàng)在引用此數(shù)據(jù)庫(kù)連接信息時(shí),首先要在應(yīng)用程序中創(chuàng)建這個(gè)新類(lèi)的一個(gè)方法,然后再初始化連接對(duì)象,代建這個(gè)新類(lèi)的一個(gè)方法,然后再初始化連接對(duì)象,代碼如下。碼如下。 SqlConnection conn = new SqlConnection(); MyC
16、lass mc = new MyClass(); conn.ConnectionString = mc.strCon; 在創(chuàng)建數(shù)據(jù)庫(kù)連接時(shí),建議使用在創(chuàng)建數(shù)據(jù)庫(kù)連接時(shí),建議使用Using語(yǔ)句塊語(yǔ)句塊;其作用為其作用為:定義一個(gè):定義一個(gè)范圍范圍,在范圍結(jié)束時(shí)處理對(duì)象,在范圍結(jié)束時(shí)處理對(duì)象(當(dāng)離開(kāi)包含的代碼段時(shí)自動(dòng)調(diào)用該類(lèi)實(shí)例的(當(dāng)離開(kāi)包含的代碼段時(shí)自動(dòng)調(diào)用該類(lèi)實(shí)例的Dispose()方法,自動(dòng)關(guān)閉數(shù)據(jù)庫(kù)連接且釋放連()方法,自動(dòng)關(guān)閉數(shù)據(jù)庫(kù)連接且釋放連接所使用的資源);接所使用的資源); 如果需要使用一個(gè)對(duì)象,這個(gè)對(duì)象需要占用很多如果需要使用一個(gè)對(duì)象,這個(gè)對(duì)象需要占用很多緊缺的資源,使用完成后需
17、要馬上釋放掉的話(huà),建緊缺的資源,使用完成后需要馬上釋放掉的話(huà),建議使用議使用using語(yǔ)句;語(yǔ)句; 優(yōu)勢(shì)優(yōu)勢(shì):可以避免資源釋放不及時(shí)導(dǎo)致的沖突或性:可以避免資源釋放不及時(shí)導(dǎo)致的沖突或性能問(wèn)題。能問(wèn)題。 using (SqlConnection conn=new SqlConnection() )using (SqlConnection conn=new SqlConnection() ) conn.ConnectionString=“” conn.ConnectionString=“”; conn.Open(); conn.Open(); /此處無(wú)需再關(guān)閉連接(因已自動(dòng)關(guān)閉并釋放了資源)此處無(wú)
18、需再關(guān)閉連接(因已自動(dòng)關(guān)閉并釋放了資源)lClose()方法只是關(guān)閉了連接,但是這個(gè)連接被方法只是關(guān)閉了連接,但是這個(gè)連接被存儲(chǔ)到連接池,所以在調(diào)用存儲(chǔ)到連接池,所以在調(diào)用Close()方法以后,方法以后,還可以再通過(guò)還可以再通過(guò) Open()方法打開(kāi)數(shù)據(jù)連接。方法打開(kāi)數(shù)據(jù)連接。l調(diào)用調(diào)用Dispose()方法以后,數(shù)據(jù)連接就不能再使方法以后,數(shù)據(jù)連接就不能再使用了(再使用用了(再使用Open()方法會(huì)報(bào)錯(cuò))。方法會(huì)報(bào)錯(cuò))。說(shuō)明:再給說(shuō)明:再給connectionString重新賦值才能打開(kāi)重新賦值才能打開(kāi)數(shù)據(jù)連接。數(shù)據(jù)連接。292022-4-14Command對(duì)象最主要的工作是通過(guò)對(duì)象最主要
19、的工作是通過(guò)Connection對(duì)對(duì)象對(duì)數(shù)據(jù)源下達(dá)象對(duì)數(shù)據(jù)源下達(dá)操作數(shù)據(jù)庫(kù)操作數(shù)據(jù)庫(kù)的命令。使用戶(hù)能夠訪(fǎng)的命令。使用戶(hù)能夠訪(fǎng)問(wèn)用于返回?cái)?shù)據(jù)、修改數(shù)據(jù)運(yùn)行存儲(chǔ)過(guò)程以及發(fā)送問(wèn)用于返回?cái)?shù)據(jù)、修改數(shù)據(jù)運(yùn)行存儲(chǔ)過(guò)程以及發(fā)送或檢索參數(shù)信息的數(shù)據(jù)庫(kù)命令?;驒z索參數(shù)信息的數(shù)據(jù)庫(kù)命令。 下列語(yǔ)法產(chǎn)生下列語(yǔ)法產(chǎn)生 Command對(duì)象:對(duì)象:SqlCommand com = new SqlCommand(string ,conn);要執(zhí)行的要執(zhí)行的SQLSQL語(yǔ)句語(yǔ)句已建立的已建立的Connection對(duì)象對(duì)象312022-4-14ExecuteNonQuery:執(zhí)行不返回任何行的命令。:執(zhí)行不返回任何行的命令。典
20、型的例子是實(shí)現(xiàn)典型的例子是實(shí)現(xiàn)插入、更新和刪除插入、更新和刪除。 ExecuteReader:通過(guò):通過(guò)Connection對(duì)象下達(dá)命令至對(duì)象下達(dá)命令至數(shù)據(jù)源,將數(shù)據(jù)作為一個(gè)數(shù)據(jù)源,將數(shù)據(jù)作為一個(gè) DataReader 對(duì)象返回。對(duì)象返回。用于用于任何返回?cái)?shù)據(jù)的任何返回?cái)?shù)據(jù)的 SQL 查詢(xún)查詢(xún); ExecuteScalar:從數(shù)據(jù)庫(kù)中返回單獨(dú)值,例如與:從數(shù)據(jù)庫(kù)中返回單獨(dú)值,例如與特定查詢(xún)相匹配的記錄數(shù)特定查詢(xún)相匹配的記錄數(shù),或者數(shù)據(jù)庫(kù)功能調(diào)用,或者數(shù)據(jù)庫(kù)功能調(diào)用的結(jié)果。的結(jié)果。 ExecuteNonQuery方法執(zhí)行更新操作,諸如那些與方法執(zhí)行更新操作,諸如那些與UPDATE、INSERT和
21、和DELETE語(yǔ)句有關(guān)的操作,語(yǔ)句有關(guān)的操作,該方法返回一個(gè)整型(該方法返回一個(gè)整型(Integer)數(shù)據(jù),)數(shù)據(jù),返回值是命返回值是命令影響的行數(shù)。令影響的行數(shù)。例如,創(chuàng)建一個(gè)例如,創(chuàng)建一個(gè)SqlCommand,然后使用,然后使用ExecuteNonQuery方法執(zhí)行方法執(zhí)行SQL語(yǔ)句,如:語(yǔ)句,如:UPDATE、INSERT或或DELETE?!纠?】 使用使用ExecuteNonQuery方法向數(shù)據(jù)庫(kù)中插方法向數(shù)據(jù)庫(kù)中插入記錄。入記錄。 1、建立建立數(shù)據(jù)源連接數(shù)據(jù)源連接對(duì)象并打開(kāi):對(duì)象并打開(kāi): con=new SqlConnection() ; con.Open();2、建立、建立命令對(duì)
22、象命令對(duì)象: com=new SqlCommand(要執(zhí)行的要執(zhí)行的SQL語(yǔ)句,語(yǔ)句,con );3、執(zhí)行命令對(duì)象的執(zhí)行命令對(duì)象的ExecuteNonQuery()方法方法 com. ExecuteNonQuery();4、斷開(kāi)數(shù)據(jù)源斷開(kāi)數(shù)據(jù)源 con.Close();ExecuteReader方法通常與方法通常與查詢(xún)命令查詢(xún)命令一起使用,并一起使用,并且返回一個(gè)數(shù)據(jù)閱讀器對(duì)象且返回一個(gè)數(shù)據(jù)閱讀器對(duì)象DataReader,該對(duì)象連,該對(duì)象連接到數(shù)據(jù)庫(kù)的結(jié)果集上,并允許行檢索。接到數(shù)據(jù)庫(kù)的結(jié)果集上,并允許行檢索。數(shù)據(jù)閱讀器是一種數(shù)據(jù)閱讀器是一種只讀的、向前移動(dòng)的游標(biāo)只讀的、向前移動(dòng)的游標(biāo),客戶(hù),
23、客戶(hù)端代碼滾動(dòng)游標(biāo)并從中讀取數(shù)據(jù)。端代碼滾動(dòng)游標(biāo)并從中讀取數(shù)據(jù)。 SqlCommand com = new SqlCommand(queryString, connection);/通過(guò)通過(guò)ExecuteReader方法創(chuàng)建方法創(chuàng)建DataReader對(duì)象對(duì)象SqlDataReader dr = com.ExecuteReader();if (dr.Read() / else / 使用使用DataReader對(duì)象中的對(duì)象中的Read方法方法用來(lái)遍歷整個(gè)結(jié)果集,不需要顯式地向用來(lái)遍歷整個(gè)結(jié)果集,不需要顯式地向前移動(dòng)指針,或者檢查文件的結(jié)束,如前移動(dòng)指針,或者檢查文件的結(jié)束,如果沒(méi)有要讀取的記錄了
24、,則果沒(méi)有要讀取的記錄了,則Read方法會(huì)方法會(huì)自動(dòng)返回自動(dòng)返回False?!纠?】 使用使用ExecuteReader方法將性別為方法將性別為“女女”性性的記錄顯示在的記錄顯示在GridView控件中??丶小?注意:注意:DataReader對(duì)象不能用對(duì)象不能用new運(yùn)算符生運(yùn)算符生成,只能使用成,只能使用Command對(duì)象的對(duì)象的ExecuteReader()方法來(lái)創(chuàng)建。方法來(lái)創(chuàng)建。SqlDataReader dr=cmd.ExecuteReader();Command對(duì)象對(duì)象1、建立數(shù)據(jù)源連接對(duì)象:、建立數(shù)據(jù)源連接對(duì)象: SqlConnection con2、打開(kāi)數(shù)據(jù)源:、打開(kāi)數(shù)據(jù)源
25、:con.Open();3、執(zhí)行數(shù)據(jù)訪(fǎng)問(wèn)命令:、執(zhí)行數(shù)據(jù)訪(fǎng)問(wèn)命令:SqlCommand cmd = new SqlCommand();4、加載數(shù)據(jù)行流:、加載數(shù)據(jù)行流: SqlDataReader dr =cmd.ExecuteReader(); 5、讀取數(shù)據(jù)行流:、讀取數(shù)據(jù)行流:while (dr.Read() 或或 if (dr.Read() 6、關(guān)閉數(shù)據(jù)行流:、關(guān)閉數(shù)據(jù)行流: dr.Close();7、關(guān)閉、關(guān)閉斷開(kāi)斷開(kāi)數(shù)據(jù)源:數(shù)據(jù)源: con.Close();執(zhí)行查詢(xún),并返回結(jié)果集中執(zhí)行查詢(xún),并返回結(jié)果集中第一行的第一列的值。第一行的第一列的值。如果只想檢索數(shù)據(jù)庫(kù)信息中的一個(gè)值,而不需
26、要返如果只想檢索數(shù)據(jù)庫(kù)信息中的一個(gè)值,而不需要返回表或數(shù)據(jù)流形式的數(shù)據(jù)庫(kù)信息?;乇砘驍?shù)據(jù)流形式的數(shù)據(jù)庫(kù)信息。例如,只需要返例如,只需要返回回 COUNT(*)、SUM( ) 或或 AVG( ) 等函數(shù)的結(jié)果等函數(shù)的結(jié)果,那么那么Command對(duì)象的對(duì)象的ExecuteScalar方法就很有用。方法就很有用。如果在一個(gè)常規(guī)查詢(xún)語(yǔ)句當(dāng)中調(diào)用該方法,則只讀如果在一個(gè)常規(guī)查詢(xún)語(yǔ)句當(dāng)中調(diào)用該方法,則只讀取第一行第一列的值,而丟棄所有其他值。取第一行第一列的值,而丟棄所有其他值。在數(shù)據(jù)庫(kù)在數(shù)據(jù)庫(kù)colledge.mdf中,有一個(gè)中,有一個(gè)teacher表如下表如下所示:所示:窗體上有一文本框(名稱(chēng)為窗體上
27、有一文本框(名稱(chēng)為T(mén)extBox1)TextBox1)和一命令按鈕和一命令按鈕( (名稱(chēng)名稱(chēng)為為Button1)Button1),有如下代碼:,有如下代碼: SqlConnection conn = new SqlConnection();SqlConnection conn = new SqlConnection();conn.ConnectionString =Data Source=.SQLEXPRESS; conn.ConnectionString =Data Source=.SQLEXPRESS; AttachDbFilename=|DataDirectory| colledge.m
28、df;AttachDbFilename=|DataDirectory| colledge.mdf; Integrated Security=True;User Instance=True; Integrated Security=True;User Instance=True; conn.Open(); conn.Open(); string sql = select count( string sql = select count(* *) from teacher where ) from teacher where 年年齡齡35;35;/string sql = select /stri
29、ng sql = select * * from teacher where from teacher where 年齡年齡35; 35; /常規(guī)查詢(xún),返回結(jié)果集中第常規(guī)查詢(xún),返回結(jié)果集中第1 1行第行第1 1列的值列的值 SqlCommand com = new SqlCommand(sql, conn); SqlCommand com = new SqlCommand(sql, conn); TextBox1.Text = com.ExecuteScalar().ToString(); TextBox1.Text = com.ExecuteScalar().ToString(); conn
30、.Close();conn.Close();程序執(zhí)行后,文本框顯示的內(nèi)容?程序執(zhí)行后,文本框顯示的內(nèi)容?當(dāng)當(dāng)Command 對(duì)象返回結(jié)果集時(shí),需要使用對(duì)象返回結(jié)果集時(shí),需要使用DataReader對(duì)象來(lái)檢索數(shù)據(jù)。對(duì)象來(lái)檢索數(shù)據(jù)。DataReader 對(duì)象返對(duì)象返回一個(gè)來(lái)自回一個(gè)來(lái)自Command 的只讀的、只能向前的數(shù)據(jù)的只讀的、只能向前的數(shù)據(jù)流。流。在與數(shù)據(jù)庫(kù)的交互中,要獲得數(shù)據(jù)訪(fǎng)問(wèn)的結(jié)果可在與數(shù)據(jù)庫(kù)的交互中,要獲得數(shù)據(jù)訪(fǎng)問(wèn)的結(jié)果可用用兩種兩種方法來(lái)實(shí)現(xiàn),第一種是通過(guò)方法來(lái)實(shí)現(xiàn),第一種是通過(guò)DataReader對(duì)對(duì)象從數(shù)據(jù)源中獲取數(shù)據(jù)并進(jìn)行處理;第二種是通象從數(shù)據(jù)源中獲取數(shù)據(jù)并進(jìn)行處理;第二
31、種是通過(guò)過(guò)DataSet對(duì)象將數(shù)據(jù)放置在內(nèi)存中進(jìn)行處理。對(duì)象將數(shù)據(jù)放置在內(nèi)存中進(jìn)行處理。連線(xiàn)模式數(shù)據(jù)訪(fǎng)問(wèn)連線(xiàn)模式數(shù)據(jù)訪(fǎng)問(wèn)DataReaderDataReader對(duì)象對(duì)象GetName:取得指定字段的字段名稱(chēng):取得指定字段的字段名稱(chēng)GetValue:取得指定字段的數(shù)據(jù):取得指定字段的數(shù)據(jù)Read :讓?zhuān)鹤孌ataRead對(duì)象讀取下一條記錄,如果對(duì)象讀取下一條記錄,如果有記錄返回有記錄返回True,否則返回,否則返回False。Close :關(guān)閉:關(guān)閉DataRead對(duì)象,注意,關(guān)閉閱讀器對(duì)象,注意,關(guān)閉閱讀器對(duì)象不會(huì)自動(dòng)關(guān)閉底層連接。對(duì)象不會(huì)自動(dòng)關(guān)閉底層連接。HasRows:指示:指示 Data
32、Reader 是否包含一行或多是否包含一行或多行。在讀取記錄集內(nèi)容以前使用這個(gè)屬性來(lái)判斷行。在讀取記錄集內(nèi)容以前使用這個(gè)屬性來(lái)判斷記錄集中是否有記錄。記錄集中是否有記錄。FieldCount:獲取當(dāng)前行中的字段數(shù):獲取當(dāng)前行中的字段數(shù)注意:注意:DataReader對(duì)象不能用對(duì)象不能用new運(yùn)算符生成,運(yùn)算符生成,只能使用只能使用Command對(duì)象的對(duì)象的ExecuteReader()方法方法來(lái)創(chuàng)建。來(lái)創(chuàng)建。SqlCommand cmd= new SqlCommand( SELECT *FROM Customers ,conn); /查詢(xún)查詢(xún)Customers表表SqlDataReader d
33、r=cmd.ExecuteReader();While(dr.Read() /循環(huán)讀取數(shù)據(jù)循環(huán)讀取數(shù)據(jù) dr.Close(); /關(guān)閉關(guān)閉DataReader對(duì)象對(duì)象在數(shù)據(jù)庫(kù)在數(shù)據(jù)庫(kù)colledge.mdf中,有一個(gè)中,有一個(gè)teacher表,如表所示。在表,如表所示。在窗體上有一個(gè)按鈕(其窗體上有一個(gè)按鈕(其ID為為Button1)和一個(gè)列表框(其)和一個(gè)列表框(其ID為為L(zhǎng)istBox1)。程序運(yùn)行后,單擊命令按鈕,列表框中的)。程序運(yùn)行后,單擊命令按鈕,列表框中的內(nèi)容是什么??jī)?nèi)容是什么? SqlConnection conn = new SqlConnection();SqlConnec
34、tion conn = new SqlConnection();conn.ConnectionString =Data Source=.SQLEXPRESS; conn.ConnectionString =Data Source=.SQLEXPRESS; AttachDbFilename=|DataDirectory| colledge.mdf;AttachDbFilename=|DataDirectory| colledge.mdf; Integrated Security=True;User Instance=True; Integrated Security=True;User Inst
35、ance=True; conn.Open(); conn.Open(); string strsql = select string strsql = select * * from teacher where from teacher where 姓名姓名 like like %王王%;%; SqlCommand com = new SqlCommand(strsql, conn); SqlCommand com = new SqlCommand(strsql, conn); SqlDataReader dr = com.ExecuteReader(); SqlDataReader dr =
36、 com.ExecuteReader(); while (dr.Read() while (dr.Read() ListBox1 .Items .Add (dr ListBox1 .Items .Add (dr姓名姓名.ToString(); .ToString(); conn.Close(); conn.Close();獲取查詢(xún)結(jié)果獲取查詢(xún)結(jié)果中的中的”姓名姓名”字段值字段值上例中,用戶(hù)登錄時(shí)輸入任意用戶(hù)名,密碼為:上例中,用戶(hù)登錄時(shí)輸入任意用戶(hù)名,密碼為: 1 or 1=1則能夠成功登錄則能夠成功登錄分析:分析:形成的查詢(xún)語(yǔ)句為:形成的查詢(xún)語(yǔ)句為:select * from T_users
37、 where uname=dd and password=1 or 1=1 可見(jiàn)執(zhí)行可見(jiàn)執(zhí)行com.ExecuteReader()方法時(shí)會(huì)返回所有記錄方法時(shí)會(huì)返回所有記錄 當(dāng)應(yīng)用程序使用輸入內(nèi)容來(lái)構(gòu)造動(dòng)態(tài)當(dāng)應(yīng)用程序使用輸入內(nèi)容來(lái)構(gòu)造動(dòng)態(tài)sql語(yǔ)句以訪(fǎng)語(yǔ)句以訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)時(shí),會(huì)發(fā)生問(wèn)數(shù)據(jù)庫(kù)時(shí),會(huì)發(fā)生sql注入攻擊注入攻擊 。使用二種方法使用二種方法均可均可參數(shù)化查詢(xún)是指在與參數(shù)化查詢(xún)是指在與數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)連接并訪(fǎng)問(wèn)數(shù)據(jù)時(shí),連接并訪(fǎng)問(wèn)數(shù)據(jù)時(shí),在在需要填入數(shù)據(jù)的地方,需要填入數(shù)據(jù)的地方,使用參數(shù)使用參數(shù) (Parameter) 來(lái)給來(lái)給值值,該方法可以有效預(yù)防,該方法可以有效預(yù)防SQL注入攻擊注入攻擊 。
38、原理:在使用參數(shù)化查詢(xún)的情況下,原理:在使用參數(shù)化查詢(xún)的情況下,數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)服務(wù)器服務(wù)器不會(huì)將參數(shù)的內(nèi)容視為不會(huì)將參數(shù)的內(nèi)容視為SQL指令的一部分來(lái)處理,指令的一部分來(lái)處理,而是在數(shù)據(jù)庫(kù)完成而是在數(shù)據(jù)庫(kù)完成 SQL 指令的編譯后,才套用參指令的編譯后,才套用參數(shù)運(yùn)行,因此即使參數(shù)中含有惡意的指令,由于已數(shù)運(yùn)行,因此即使參數(shù)中含有惡意的指令,由于已經(jīng)編譯完成,就不會(huì)被數(shù)據(jù)庫(kù)所運(yùn)行。經(jīng)編譯完成,就不會(huì)被數(shù)據(jù)庫(kù)所運(yùn)行。Microsoft SQL Server 的的參數(shù)格式是以參數(shù)格式是以 “” 字符字符加上參數(shù)名稱(chēng)而構(gòu)成加上參數(shù)名稱(chēng)而構(gòu)成。 SELECT SELECT * * FROM myTabl
39、e WHERE myID = myID 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 的值。的值。
40、 (1)客戶(hù)端請(qǐng)求數(shù)據(jù)客戶(hù)端請(qǐng)求數(shù)據(jù)(2)向數(shù)據(jù)庫(kù)服務(wù)器提交請(qǐng)求向數(shù)據(jù)庫(kù)服務(wù)器提交請(qǐng)求(4)瀏覽器瀏覽器應(yīng)用程序應(yīng)用程序服務(wù)器服務(wù)器數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)服務(wù)器服務(wù)器數(shù)據(jù)集數(shù)據(jù)集(3)將數(shù)據(jù)發(fā)將數(shù)據(jù)發(fā)送到數(shù)據(jù)集送到數(shù)據(jù)集(4)數(shù)據(jù)集傳數(shù)據(jù)集傳送到客戶(hù)端送到客戶(hù)端(5)客戶(hù)端修客戶(hù)端修改數(shù)據(jù)集改數(shù)據(jù)集(6)修改后修改后的數(shù)據(jù)集的數(shù)據(jù)集傳遞到服傳遞到服務(wù)器務(wù)器SqlConnection conn = new SqlConnection();SqlConnection conn = new SqlConnection();conn.ConnectionString = “” ;/conn.Connection
41、String = “” ;/設(shè)置連接字符串設(shè)置連接字符串SqlCommand com = new SqlCommand(select SqlCommand com = new SqlCommand(select * * from from T_student, conn);T_student, conn); /操作在打開(kāi)和操作在打開(kāi)和關(guān)閉關(guān)閉數(shù)據(jù)庫(kù)之間數(shù)據(jù)庫(kù)之間conn.Open();conn.Open();SqlDataReader dr = com.ExecuteReader();SqlDataReader dr = com.ExecuteReader(); while (dr.Read(
42、) while (dr.Read() Response.Write(dr“sname.ToString() + ); Response.Write(dr“sname.ToString() + ); dr.Close();dr.Close();conn.Close();conn.Close(); SqlDataAdapter da=new SqlDataAdapter (select SqlDataAdapter da=new SqlDataAdapter (select * * from from T_student,conn );T_student,conn );/conn.Open();/
43、conn.Open();DataSet ds=new DataSet();DataSet ds=new DataSet();da.Fill(ds) da.Fill(ds) /Fill/Fill方法在執(zhí)行時(shí),若數(shù)據(jù)庫(kù)連接未打開(kāi),則自動(dòng)方法在執(zhí)行時(shí),若數(shù)據(jù)庫(kù)連接未打開(kāi),則自動(dòng)打開(kāi)打開(kāi), ,且數(shù)據(jù)填充到數(shù)據(jù)集后,自動(dòng)將連接關(guān)閉且數(shù)據(jù)填充到數(shù)據(jù)集后,自動(dòng)將連接關(guān)閉/conn.Close();/conn.Close(); / /處理數(shù)據(jù)在處理數(shù)據(jù)在連接連接關(guān)閉關(guān)閉時(shí)時(shí) for (int i=0; ids.Tables0.Rows.Count; i+)for (int i=0; ids.Tables0.R
44、ows.Count; i+) Response.Write (ds.Tables0.Rowsi“sname.ToString Response.Write (ds.Tables0.Rowsi“sname.ToString ()+)()+) da.Update (ds); da.Update (ds); /數(shù)據(jù)集中數(shù)據(jù)有變化時(shí),使用數(shù)據(jù)集中數(shù)據(jù)有變化時(shí),使用Update方法更新方法更新數(shù)據(jù)源,數(shù)據(jù)源,Update在執(zhí)行時(shí),若數(shù)據(jù)庫(kù)連接未打開(kāi),則自動(dòng)打開(kāi)在執(zhí)行時(shí),若數(shù)據(jù)庫(kù)連接未打開(kāi),則自動(dòng)打開(kāi)數(shù)數(shù)據(jù)連接,且更新數(shù)據(jù)源后自動(dòng)關(guān)閉數(shù)據(jù)連接據(jù)連接,且更新數(shù)據(jù)源后自動(dòng)關(guān)閉數(shù)據(jù)連接 對(duì)應(yīng)對(duì)應(yīng)數(shù)據(jù)數(shù)據(jù)庫(kù)服庫(kù)服
45、務(wù)器務(wù)器對(duì)應(yīng)對(duì)應(yīng) 應(yīng)應(yīng)用程序用程序服務(wù)器服務(wù)器 數(shù)據(jù)集是包含數(shù)據(jù)集是包含數(shù)據(jù)表數(shù)據(jù)表的對(duì)象,可以在這些數(shù)據(jù)表中的對(duì)象,可以在這些數(shù)據(jù)表中臨時(shí)存儲(chǔ)數(shù)據(jù)以便在應(yīng)用程序中使用。如果應(yīng)用程臨時(shí)存儲(chǔ)數(shù)據(jù)以便在應(yīng)用程序中使用。如果應(yīng)用程序要求使用數(shù)據(jù),則可以將該數(shù)據(jù)加載到數(shù)據(jù)集中,序要求使用數(shù)據(jù),則可以將該數(shù)據(jù)加載到數(shù)據(jù)集中,數(shù)據(jù)集在本地內(nèi)存中為應(yīng)用程序提供了待用數(shù)據(jù)的數(shù)據(jù)集在本地內(nèi)存中為應(yīng)用程序提供了待用數(shù)據(jù)的緩存。即使應(yīng)用程序從數(shù)據(jù)庫(kù)斷開(kāi)連接,也可以使緩存。即使應(yīng)用程序從數(shù)據(jù)庫(kù)斷開(kāi)連接,也可以使用數(shù)據(jù)集中的數(shù)據(jù)。數(shù)據(jù)集維護(hù)有關(guān)其數(shù)據(jù)的更改用數(shù)據(jù)集中的數(shù)據(jù)。數(shù)據(jù)集維護(hù)有關(guān)其數(shù)據(jù)的更改的信息,因此可以跟蹤
46、數(shù)據(jù)更新,并在應(yīng)用程序重的信息,因此可以跟蹤數(shù)據(jù)更新,并在應(yīng)用程序重新連接時(shí)將更新發(fā)送回?cái)?shù)據(jù)庫(kù)。新連接時(shí)將更新發(fā)送回?cái)?shù)據(jù)庫(kù)。斷開(kāi)式斷開(kāi)式ADO.NET數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)示例圖數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)示例圖 作用:使用作用:使用conn建立的數(shù)據(jù)連接,執(zhí)行建立的數(shù)據(jù)連接,執(zhí)行StrSel表示的表示的SQL語(yǔ)句。語(yǔ)句。例如:例如:string strsql = “select * from 表表 ;SqlCommand com=new SqlCommand (strsql ,conn); SqlDataAdapter da = new SqlDataAdapter();da.SelectCommand = com; F
47、ill Fill 方法使用方法使用 SELECT SELECT 語(yǔ)句從數(shù)據(jù)源中檢索數(shù)語(yǔ)句從數(shù)據(jù)源中檢索數(shù)據(jù)。與據(jù)。與 Select Select 命令關(guān)聯(lián)的命令關(guān)聯(lián)的 Connection Connection 對(duì)象必須有對(duì)象必須有效,效,但不需要將其打開(kāi)但不需要將其打開(kāi)。如果。如果 Fill Fill 方法發(fā)現(xiàn)連方法發(fā)現(xiàn)連接尚未打開(kāi),它將隱式地打開(kāi)接尚未打開(kāi),它將隱式地打開(kāi) DataAdapter DataAdapter 正正在使用的在使用的 ConnectionConnection,然后再將其關(guān)閉。如果調(diào),然后再將其關(guān)閉。如果調(diào)用用 Fill Fill 之前連接已打開(kāi),它將保持打開(kāi)狀態(tài)。之
48、前連接已打開(kāi),它將保持打開(kāi)狀態(tài)。l 默認(rèn)情況下,數(shù)據(jù)集不包含任何實(shí)際數(shù)據(jù)。實(shí)際默認(rèn)情況下,數(shù)據(jù)集不包含任何實(shí)際數(shù)據(jù)。實(shí)際上,用數(shù)據(jù)填充數(shù)據(jù)集指的是將數(shù)據(jù)加載到組成數(shù)上,用數(shù)據(jù)填充數(shù)據(jù)集指的是將數(shù)據(jù)加載到組成數(shù)據(jù)集的據(jù)集的 DataTable DataTable 對(duì)象中??梢酝ㄟ^(guò)執(zhí)行對(duì)象中??梢酝ㄟ^(guò)執(zhí)行 數(shù)據(jù)適數(shù)據(jù)適配器配器DataAdapterDataAdapter對(duì)象的對(duì)象的FillFill命令來(lái)命令來(lái)填充填充數(shù)據(jù)表數(shù)據(jù)表 。當(dāng)數(shù)據(jù)集中的記錄發(fā)生更改時(shí),這些更改必須寫(xiě)回當(dāng)數(shù)據(jù)集中的記錄發(fā)生更改時(shí),這些更改必須寫(xiě)回?cái)?shù)據(jù)庫(kù)。要將更改從數(shù)據(jù)集寫(xiě)入數(shù)據(jù)庫(kù),可調(diào)用負(fù)數(shù)據(jù)庫(kù)。要將更改從數(shù)據(jù)集寫(xiě)入數(shù)據(jù)庫(kù),
49、可調(diào)用負(fù)責(zé)在數(shù)據(jù)集與相應(yīng)的數(shù)據(jù)庫(kù)之間通信的責(zé)在數(shù)據(jù)集與相應(yīng)的數(shù)據(jù)庫(kù)之間通信的 DataAdapter DataAdapter 的的 Update Update 方法方法更新數(shù)據(jù)源更新數(shù)據(jù)源。FDataAdapter對(duì)象對(duì)象.Update(數(shù)據(jù)集對(duì)象數(shù)據(jù)集對(duì)象,數(shù)據(jù)表名數(shù)據(jù)表名);FSqlCommandBuilder 對(duì)象名對(duì)象名=new SqlCommandBuilder(已創(chuàng)建的已創(chuàng)建的DataAdapter對(duì)象對(duì)象);DataSet相當(dāng)于內(nèi)存中的數(shù)據(jù)庫(kù),在命名空間相當(dāng)于內(nèi)存中的數(shù)據(jù)庫(kù),在命名空間System.Data中定義;中定義;DataAdapter相當(dāng)于相當(dāng)于DataSet和物理數(shù)據(jù)
50、源之間的橋梁。和物理數(shù)據(jù)源之間的橋梁。在在DataSet內(nèi)部是一個(gè)或多個(gè)內(nèi)部是一個(gè)或多個(gè)DataTable的集合,的集合, DataSet.Tables“表名表名”可獲取數(shù)據(jù)集中的一個(gè)表??色@取數(shù)據(jù)集中的一個(gè)表。 在在DataTable 中執(zhí)行的插入、更新和刪除操作中執(zhí)行的插入、更新和刪除操作并不并不會(huì)自動(dòng)寫(xiě)回?cái)?shù)據(jù)庫(kù)會(huì)自動(dòng)寫(xiě)回?cái)?shù)據(jù)庫(kù)。如果想把更改寫(xiě)回?cái)?shù)據(jù)庫(kù),則。如果想把更改寫(xiě)回?cái)?shù)據(jù)庫(kù),則需要手動(dòng)去完成,這個(gè)操作由需要手動(dòng)去完成,這個(gè)操作由DataAdapter.UpdateDataAdapter.Update完成。完成。 DataTableCollection:表示:表示DataSet的表集合
51、。的表集合。 DataRelationCollection:表示此:表示此DataSet的的DataRelation對(duì)象的集合。對(duì)象的集合。 ExtendedProperties:獲取用戶(hù)定義的約束屬性的:獲取用戶(hù)定義的約束屬性的集合。集合。提示提示: DataSet中的各種集合,訪(fǎng)問(wèn)子項(xiàng)有兩種方法中的各種集合,訪(fǎng)問(wèn)子項(xiàng)有兩種方法,一種是用子項(xiàng)的名,一種是用數(shù)字索引。如要訪(fǎng)問(wèn)一種是用子項(xiàng)的名,一種是用數(shù)字索引。如要訪(fǎng)問(wèn)表表”student”,可以用,可以用: DataSet.Tables“student”或或DataSet.Tables0 訪(fǎng)問(wèn)訪(fǎng)問(wèn) (多張表依次類(lèi)推多張表依次類(lèi)推) 填充數(shù)據(jù)。
52、第二個(gè)參數(shù)是數(shù)據(jù)集填充數(shù)據(jù)。第二個(gè)參數(shù)是數(shù)據(jù)集中內(nèi)存表的名字,可以與數(shù)據(jù)庫(kù)中內(nèi)存表的名字,可以與數(shù)據(jù)庫(kù)中的表名不同。中的表名不同。 protected void Button1_Click(object sender, EventArgs e) SqlConnection conn = new SqlConnection(); conn.ConnectionString = ; conn.Open(); string strsql = select * from teacher where 姓名姓名 like %王王%; SqlCommand com=new SqlCommand (strsq
53、l ,conn); SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = com; DataSet ds = new DataSet(); 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í)行了命令對(duì)象藏的執(zhí)行了命令對(duì)象(Command)的查詢(xún)語(yǔ)句)的查詢(xún)語(yǔ)句protected v
54、oid Button1_Click(object sender, EventArgs e)protected void Button1_Click(object sender, EventArgs e) SqlConnection conn = new SqlConnection(); SqlConnection conn = new SqlConnection(); conn.ConnectionString = conn.ConnectionString = ConfigurationManager.ConnectionStringsconstr.ToStrinConfigurationM
55、anager.ConnectionStringsconstr.ToString(); g(); string strsql = select string strsql = select * * from 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(
56、ds, student); da.Fill(ds, student); foreach (DataRow r in ds.Tablesstudent.Rows) foreach (DataRow r in ds.Tablesstudent.Rows) Response.Write(rsname.ToString() Response.Write(rsname.ToString()+);); DataSet DataSet 的結(jié)構(gòu)和數(shù)據(jù)庫(kù)相似,插入數(shù)據(jù)實(shí)質(zhì)上就是的結(jié)構(gòu)和數(shù)據(jù)庫(kù)相似,插入數(shù)據(jù)實(shí)質(zhì)上就是在在DataSet DataSet 的數(shù)據(jù)表里插入一行的數(shù)據(jù)表里插入一行(DataRow)(Dat
57、aRow)/新建一行新建一行DataRow dr= ds.Tables“T_student”.NewRow();DataRow dr= ds.Tables“T_student”.NewRow(); / /各字段賦值各字段賦值 dr“sno”=100020;dr“sno”=100020; dr “sname” = “ dr “sname” = “李四李四”; ;dr “math” =88;dr “math” =88;/將新建的行加到將新建的行加到DataTable DataTable 的的DataRowDataRow集合中集合中ds.Tables“T_student”.Rows.Add(dr);
58、ds.Tables“T_student”.Rows.Add(dr);注意:注意:對(duì)對(duì)DataSetDataSet的操作僅僅是在的操作僅僅是在DataSetDataSet中執(zhí)行中執(zhí)行, ,并并不影響數(shù)據(jù)庫(kù)中的數(shù)據(jù)。不影響數(shù)據(jù)庫(kù)中的數(shù)據(jù)。使用使用DataAdapter DataAdapter 的的 UpdateUpdate()方法可以將()方法可以將數(shù)據(jù)集中的結(jié)果更新回?cái)?shù)據(jù)源。數(shù)據(jù)集中的結(jié)果更新回?cái)?shù)據(jù)源。注意注意: DataAdapter : DataAdapter 對(duì)象在數(shù)據(jù)發(fā)生改變時(shí)對(duì)象在數(shù)據(jù)發(fā)生改變時(shí), ,并并不能自動(dòng)產(chǎn)生數(shù)據(jù)庫(kù)系統(tǒng)所需的交易不能自動(dòng)產(chǎn)生數(shù)據(jù)庫(kù)系統(tǒng)所需的交易sqlsql語(yǔ)句語(yǔ)
59、句, ,所所以要建立一個(gè)以要建立一個(gè)CommandBuilder CommandBuilder 對(duì)象,它能自動(dòng)對(duì)象,它能自動(dòng)產(chǎn)生交易的產(chǎn)生交易的sqlsql語(yǔ)句。語(yǔ)句。SqlCommandBuilder custcb = new SqlCommandBuilder custcb = new SqlCommandBuilder(MyAdapter);SqlCommandBuilder(MyAdapter);填充數(shù)據(jù)。第二個(gè)參數(shù)是數(shù)據(jù)填充數(shù)據(jù)。第二個(gè)參數(shù)是數(shù)據(jù)集中內(nèi)存表的名字,可以與數(shù)集中內(nèi)存表的名字,可以與數(shù)據(jù)庫(kù)中的不同,據(jù)庫(kù)中的不同,F(xiàn)ill方法其實(shí)是方法其實(shí)是隱藏的執(zhí)行了命令對(duì)象隱藏的執(zhí)行了
60、命令對(duì)象(Command)的查詢(xún)語(yǔ)句)的查詢(xún)語(yǔ)句代碼要點(diǎn):代碼要點(diǎn):在上述代碼里,首先使用在上述代碼里,首先使用DataAdapter填充填充DataSet對(duì)象,然后通過(guò)對(duì)象,然后通過(guò)DataRow對(duì)象,向?qū)ο螅駾ataSet添加一添加一條記錄,最后使用條記錄,最后使用DataSet的的update方法將添加的方法將添加的記錄提交到數(shù)據(jù)庫(kù)中。執(zhí)行完記錄提交到數(shù)據(jù)庫(kù)中。執(zhí)行完update語(yǔ)句,數(shù)據(jù)表語(yǔ)句,數(shù)據(jù)表就多了一條記錄。就多了一條記錄。此外,上述代碼出現(xiàn)的此外,上述代碼出現(xiàn)的SqlCommandBuilder對(duì)象用對(duì)象用來(lái)對(duì)數(shù)據(jù)表進(jìn)行操作。用了這個(gè)對(duì)象,就不必再繁來(lái)對(duì)數(shù)據(jù)表進(jìn)行操作。用了
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度景區(qū)景點(diǎn)精細(xì)化保潔服務(wù)協(xié)議
- 二零二五年度二手車(chē)轉(zhuǎn)讓及過(guò)戶(hù)手續(xù)協(xié)議
- 二零二五年度新型小區(qū)門(mén)衛(wèi)管理及應(yīng)急預(yù)案合同
- 2025年度綠色節(jié)能庫(kù)房租賃合同
- 2025年度高新技術(shù)企業(yè)員工勞動(dòng)合同解除終止協(xié)議書(shū)
- 2025年度物業(yè)服務(wù)合同主體變更協(xié)議范本
- 二零二五年度大數(shù)據(jù)服務(wù)股權(quán)投資與轉(zhuǎn)讓協(xié)議
- 二零二五年度冷凍庫(kù)租賃及冷鏈物流配送中心建設(shè)合同
- 二零二五年度離婚協(xié)議中財(cái)產(chǎn)分割執(zhí)行監(jiān)督補(bǔ)充協(xié)議
- 蘇武牧羊傳紅色故事觀(guān)后感
- 第3課《列夫·托爾斯泰》課件-2024-2025學(xué)年統(tǒng)編版語(yǔ)文七年級(jí)下冊(cè)
- TSDLPA 0001-2024 研究型病房建設(shè)和配置標(biāo)準(zhǔn)
- 陜09J01 建筑用料及做法圖集
- 安全教育培訓(xùn)記錄表參考模板范本
- 建筑冷熱源素材
- 網(wǎng)絡(luò)安全用戶(hù)實(shí)體行為分析技術(shù)UEBA白皮書(shū)
- 室內(nèi)設(shè)計(jì)-中式古典風(fēng)格課件
- MOC3061驅(qū)動(dòng)BT134雙向可控硅
- 無(wú)線(xiàn)通信與網(wǎng)絡(luò)復(fù)習(xí)資料
- 八大員考試試題——?jiǎng)趧?wù)員題庫(kù)
- 人教版小學(xué)數(shù)學(xué)五年級(jí)下冊(cè)教材分析
評(píng)論
0/150
提交評(píng)論