版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第19章 C#數(shù)據(jù)庫編程,第19章 C#數(shù)據(jù)庫編程,數(shù)據(jù)庫技術(shù)是所有計(jì)算機(jī)應(yīng)用必不可少的一個(gè)重要環(huán)節(jié)。在.NET環(huán)境下,數(shù)據(jù)庫的訪問主要是通過ADO.NET來實(shí)現(xiàn)的。本章介紹C#數(shù)據(jù)庫編程知識(shí),并用實(shí)例講述C#訪問常用數(shù)據(jù)庫,如SQL Server、Oracle、Access等的方法。 本章教學(xué)目的: 了解ADO.NET 掌握應(yīng)用ADO.NET對(duì)數(shù)據(jù)庫進(jìn)行訪問的編程技術(shù) 學(xué)會(huì)C#數(shù)據(jù)庫應(yīng)用程序的設(shè)計(jì),第19章 C#數(shù)據(jù)庫編程,19.1 ADO.NET 數(shù)據(jù)庫訪問 19.2 ADO.NET訪問常用數(shù)據(jù)庫 19.3 C#數(shù)據(jù)庫的Windows編程 19.4 C#數(shù)據(jù)庫的Web編程,19.1 ADO
2、.NET 數(shù)據(jù)庫訪問,19.1.1 ADO.NET概述 19.1.2 ADO.NET的數(shù)據(jù)訪問對(duì)象,19.1 ADO.NET 數(shù)據(jù)庫訪問,19.1.1 ADO.NET概述,ActiveX Data Objects.NET(簡稱ADO.NET)是微軟設(shè)計(jì)的一種新的數(shù)據(jù)庫訪問技術(shù)。ADO.NET并非是ADO的升級(jí)版,同以往的數(shù)據(jù)庫訪問技術(shù)相比,ADO.NET有很多數(shù)據(jù)處理的優(yōu)勢。首先ADO.NET提供了對(duì)XML的強(qiáng)大支持,可以通過XMLReader、XMLWriter、XMLNavigater和 XMLDocument等方便地創(chuàng)建和使用XML數(shù)據(jù);其次ADO.NET是為關(guān)系數(shù)據(jù)訪問和非關(guān)系數(shù)據(jù)訪問
3、設(shè)計(jì)的數(shù)據(jù)連接模型,它可以實(shí)現(xiàn)對(duì)數(shù)據(jù)源的非連接處理;另外ADO.NET新增了一些對(duì)象,如DataReader可以產(chǎn)生一個(gè)只讀的記錄集,用來實(shí)現(xiàn)快速讀取數(shù)據(jù)。 ADO.NET的最突出的特性是可以采用非連接的方式訪問和處理數(shù)據(jù),這是ADO所沒有的(ADO只能采用連接的方式訪問和處理數(shù)據(jù))。ADO采用基于連接的方式處理數(shù)據(jù)庫的最大不足就是它耗費(fèi)了太多的資源,尤其當(dāng)在網(wǎng)絡(luò)環(huán)境下時(shí),大量用戶同時(shí)訪問數(shù)據(jù)庫會(huì)給數(shù)據(jù)庫服務(wù)器造成很大的負(fù)擔(dān)。ADO.NET只在必要的時(shí)候?qū)?shù)據(jù)庫進(jìn)行連接,當(dāng)處理完畢后它將及時(shí)關(guān)閉連接,這就保證了數(shù)據(jù)庫服務(wù)器資源的可用性,使它可以為更多的用戶服務(wù),因此也就更加適合網(wǎng)絡(luò)應(yīng)用。,19
4、.1.1 ADO.NET概述,1. ADO.NET構(gòu)架 ADO.NET的體系結(jié)構(gòu)如圖19.1所示。 ADO.NET具有兩大核心組件: DataSet數(shù)據(jù)集和.NET Data Provider數(shù)據(jù)提供程序。.NET Data Provider中包括Connection對(duì)象、Command對(duì)象、DataReader對(duì)象和DataAdapter 對(duì)象。Connection對(duì)象用來和數(shù)據(jù)源進(jìn)行連接;Command對(duì)象可以用來從數(shù)據(jù)庫中返回?cái)?shù)據(jù)、修改數(shù)據(jù)或運(yùn)行存儲(chǔ)過程;DataReader對(duì)象則提供了對(duì)數(shù)據(jù)庫的快速只讀、前向訪問功能;DataAdapter 對(duì)象是數(shù)據(jù)源和數(shù)據(jù)集DataSet對(duì)象交換數(shù)
5、據(jù)的橋梁,它負(fù)責(zé)將數(shù)據(jù)庫中的數(shù)據(jù)填充到DataSet對(duì)象中。,19.1.1 ADO.NET概述,圖19.1 ADO.NET的體系結(jié)構(gòu),19.1.1 ADO.NET概述,2. ADO.NET連接數(shù)據(jù)源的方式 曾經(jīng)使用過ADO的讀者都知道ADO對(duì)象中比較重要的一個(gè)對(duì)象是記錄集Recordset對(duì)象。Recordset對(duì)象用記錄集保存從數(shù)據(jù)庫中返回的數(shù)據(jù),ADO緩存中的數(shù)據(jù)是由一條條記錄構(gòu)成的記錄集。ADO把記錄集當(dāng)作一個(gè)表,對(duì)數(shù)據(jù)庫的操作就演化為對(duì)該表的操作。如果記錄集的內(nèi)容來自多個(gè)數(shù)據(jù)庫表,還必須使用關(guān)聯(lián)查詢把它們合并到一個(gè)表中。 與ADO中的Recordset對(duì)象對(duì)應(yīng),在ADO.NET中提供了
6、一個(gè)數(shù)據(jù)集DataSet對(duì)象,它取代了Recordset對(duì)象的位置。ADO.NET就是使用數(shù)據(jù)集DataSet對(duì)象實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫數(shù)據(jù)的非連接處理。 數(shù)據(jù)集DataSet對(duì)象可以理解為一個(gè)本地的小型數(shù)據(jù)庫。數(shù)據(jù)集模型包含一個(gè)由單個(gè)或多個(gè)數(shù)據(jù)表(DataTable)組成的集合,而DataTable又由許多行(DataRow)和列(DataColumn)組成。DataSet對(duì)象中還包含一個(gè)DataRelation對(duì)象的集合,用它來表示各個(gè)數(shù)據(jù)表之間的關(guān)系,數(shù)據(jù)集結(jié)構(gòu)如圖19.2所示。 數(shù)據(jù)集包含了用戶請(qǐng)求的那部分?jǐn)?shù)據(jù)庫在內(nèi)存中的備份。這個(gè)備份甚至能包含多個(gè)表以及表之間的關(guān)系的整個(gè)數(shù)據(jù)庫。所以對(duì)于數(shù)據(jù)
7、集對(duì)象的訪問類似于對(duì)數(shù)據(jù)庫的訪問,即數(shù)據(jù)集提供了被訪問數(shù)據(jù)庫的非連接備份離線備份,這相當(dāng)于直接給出了處理數(shù)據(jù)庫的情境,也就是說,給用戶的感覺是數(shù)據(jù)集與數(shù)據(jù)源是直接連接的。 ADO.NET連接數(shù)據(jù)源機(jī)制是:首先通過數(shù)據(jù)提供程序中的Connection對(duì)象連接數(shù)據(jù)源,然后由DataAdapter對(duì)象用數(shù)據(jù)庫的數(shù)據(jù)填充數(shù)據(jù)集,并通過Command和DataReader對(duì)象對(duì)數(shù)據(jù)集中的數(shù)據(jù)進(jìn)行各種操作,最后把對(duì)數(shù)據(jù)源數(shù)據(jù)的更新返回?cái)?shù)據(jù)源,如圖19.1所示。這種連接機(jī)制可以避免多重寫入和多重讀出。 可見數(shù)據(jù)集是通過無關(guān)聯(lián)對(duì)象訪問數(shù)據(jù)庫信息的,實(shí)現(xiàn)了連接對(duì)象與數(shù)據(jù)對(duì)象的相對(duì)獨(dú)立。數(shù)據(jù)集的缺點(diǎn)是要求高速緩存
8、大量的數(shù)據(jù),如當(dāng)需要將表中的所有數(shù)據(jù)送入數(shù)據(jù)集時(shí)。,19.1.1 ADO.NET概述,圖19.2 數(shù)據(jù)集結(jié)構(gòu),19.1.1 ADO.NET概述,3. ADO.NET數(shù)據(jù)訪問接口 ADO.NET數(shù)據(jù)提供程序?yàn)閼?yīng)用程序開發(fā)提供多層非連接模式,它幫助建立數(shù)據(jù)集和數(shù)據(jù)源之間的連接。ADO.NET提供了兩套數(shù)據(jù)提供程序,它們是SQL Server .NET 數(shù)據(jù)提供程序(System.Data.SqlClient命名空間)和OLE DB .NET數(shù)據(jù)提供程序(System.Data.OleDb命名空間)。每種數(shù)據(jù)提供程序都包含一組構(gòu)成ADO.NET構(gòu)架的類。 SQL Server .NET 數(shù)據(jù)提供程序
9、屬于System.Data.SqlClient命名空間,它提供一組對(duì)象來建立數(shù)據(jù)集的表和SQL Server數(shù)據(jù)庫中的表之間的聯(lián)系,其對(duì)象名稱以Sql前綴加.NET數(shù)據(jù)提供程序?qū)ο竺?,如SqlConnection、SqlDataAdapter等。SQL Server .NET 數(shù)據(jù)提供程序具有自己的一套訪問SQL Server數(shù)據(jù)庫的協(xié)議,對(duì)訪問SQL Server數(shù)據(jù)庫提供了特殊的優(yōu)化。 OLE DB .NET數(shù)據(jù)支持程序是用來建立數(shù)據(jù)集中的表與OLE DB數(shù)據(jù)源之間的連接,其對(duì)象名稱以O(shè)leDb前綴加.NET數(shù)據(jù)提供程序?qū)ο竺鏞leDbConnection、OleDbDataAdapt
10、er等,它需借助OLE DB 服務(wù)組件和數(shù)據(jù)庫的OLE DB支持供程序來訪問數(shù)據(jù)庫,由于需要通過一些中間層,因此在性能上有些損失。如果訪問Microsoft SQL Server 7.0及以上的數(shù)據(jù)庫系統(tǒng)使用SQL Server .NET 數(shù)據(jù)支持程序更佳,而如果訪問Microsoft SQL Server 6.5或較早的數(shù)據(jù)庫系統(tǒng),或那些提供有符合條件的OLE DB數(shù)據(jù)提供程序的數(shù)據(jù)庫系統(tǒng)使用OLE DB .NET 數(shù)據(jù)提供程序更好。,19.1.2 ADO.NET的數(shù)據(jù)訪問對(duì)象,ADO.NET使用了某些ADO的對(duì)象,如Connection和Command對(duì)象,并且還引入了新的對(duì)象。ADO.N
11、ET增加的新對(duì)象包括DataSet、DataReader和DataAdapter。使用ADO.NET訪問數(shù)據(jù)庫離不開對(duì)DataSet對(duì)象和.NET數(shù)據(jù)提供程序中的對(duì)象的操作,以下一一介紹它們的作用和使用方法。 1. DataSet(數(shù)據(jù)集)對(duì)象 DataSet(數(shù)據(jù)集)對(duì)象是ADO.NET對(duì)象模型中最核心的對(duì)象。一個(gè)DataSet(數(shù)據(jù)集)對(duì)象就是一個(gè)記錄集的集合,它相當(dāng)于數(shù)據(jù)緩沖區(qū)。ADO.NET框架提供了記錄集的所有數(shù)據(jù)庫功能:排序、分頁、過濾視圖、關(guān)系、索引和主鍵。 DataSet 對(duì)象與ADO的Recordset 對(duì)象相似,但功能更為強(qiáng)大,ADO的一個(gè)重要區(qū)別就是DataSet 始終與
12、數(shù)據(jù)源是斷開的。DataSet 對(duì)象表示數(shù)據(jù)的緩存,具有類似數(shù)據(jù)庫的結(jié)構(gòu),如表、列、關(guān)系和約束。但是,盡管 DataSet 可以并且的確像數(shù)據(jù)庫那樣運(yùn)行,但DataSet 對(duì)象不直接與數(shù)據(jù)或其他源數(shù)據(jù)進(jìn)行交互。這使得開發(fā)人員能夠使用始終保持一致的編程模型,而不用理會(huì)源數(shù)據(jù)的駐留位置。所有來自于數(shù)據(jù)庫、XML 文件、代碼或用戶輸入的數(shù)據(jù)都可添加到 DataSet 對(duì)象中。這樣,當(dāng)對(duì) DataSet 進(jìn)行了更改,則在更新源數(shù)據(jù)之前可以對(duì)這些更改進(jìn)行跟蹤和驗(yàn)證。DataSet 對(duì)象的 GetChanges 方法實(shí)際上是創(chuàng)建了另一個(gè)DatSet,該DatSet只包含對(duì)數(shù)據(jù)做出的更改,然后DataAda
13、pter(或其他對(duì)象)使用此 DataSet 來更新原始的數(shù)據(jù)源。 DataSet 具有許多 XML 特性,包括生成和使用 XML 數(shù)據(jù)和 XML 架構(gòu)的能力。XML 架構(gòu)可以用來描述通過 WebServices 交換的架構(gòu)。實(shí)際上,為了類型安全和語句結(jié)束,可以對(duì)帶有架構(gòu)的 DataSet 進(jìn)行編譯。 DataSet(數(shù)據(jù)集)對(duì)象的公共屬性如表19.1所示。,19.1.2 ADO.NET的數(shù)據(jù)訪問對(duì)象,表19.1 DataSet(數(shù)據(jù)集)對(duì)象的公共屬性,19.1.2 ADO.NET的數(shù)據(jù)訪問對(duì)象,DataSet(數(shù)據(jù)集)對(duì)象的公共方法如表19.2所示。,表19.2 DataSet(數(shù)據(jù)集)對(duì)象
14、的公共方法,19.1.2 ADO.NET的數(shù)據(jù)訪問對(duì)象,2. Connection對(duì)象 要訪問數(shù)據(jù)源的數(shù)據(jù),首先要做的就是建立與該數(shù)據(jù)源的連接。Connection對(duì)象就是用來建立與數(shù)據(jù)庫的連接。Connection對(duì)象提供一些屬性用于我們輸入與數(shù)據(jù)源進(jìn)行連接所需的信息,如數(shù)據(jù)源所在的位置、數(shù)據(jù)庫名、連接的用戶賬號(hào)和密碼等,它提供的公共屬性如表19.9所示。 Connection對(duì)象的公共方法如表19.10所示。,19.1.2 ADO.NET的數(shù)據(jù)訪問對(duì)象,表19.9 公共屬性,19.1.2 ADO.NET的數(shù)據(jù)訪問對(duì)象,表19.10 公共方法,19.1.2 ADO.NET的數(shù)據(jù)訪問對(duì)象,創(chuàng)建
15、連接對(duì)象。可通過調(diào)用Open()方法顯式打開連接,也可使用 DataAdapter 隱式打開連接。 連接數(shù)據(jù)源有以下兩種方式。 SqlConnection:建立與支持SQL Managed Provider的數(shù)據(jù)庫的連接。 OleDbConnection:建立與支持ADO.NET Managed Provider的數(shù)據(jù)源的連接。 (1)采用SQL Managed Provider連接到數(shù)據(jù)庫 /創(chuàng)建數(shù)據(jù)庫連接 SqlConnection mySqlConnection =new SqlConnection(Server=myservername;Database=mydatabase; uid
16、=myuser;pwd=mypassword; ConnectionTimeout=30); mySqlConnection.Open(); /打開剛建立的與SQL Server數(shù)據(jù)庫的連接 mySqlConnection.Close(); /關(guān)閉連接 (2)采用ADO.NET Managed Provider連接到數(shù)據(jù)源 連接Access數(shù)據(jù)庫的語句: OleDbConnection myOleDbConnection=new OleDbConnection(Provider=Microsoft.Jet.OLEDB.4.0; DataSource=mypathmyfile.mdb; Conn
17、ectionTimeout=30); MyOleDbConnection.Open(); /打開連接 MyOleDbConnection.Close(); /關(guān)閉連接,19.1.2 ADO.NET的數(shù)據(jù)訪問對(duì)象,3. Command對(duì)象 當(dāng)與數(shù)據(jù)庫建立了連接后,就可以用Command對(duì)象用來讀取或修改數(shù)據(jù)源的數(shù)據(jù),如進(jìn)行對(duì)數(shù)據(jù)庫數(shù)據(jù)的增、刪、改等數(shù)據(jù)庫操作。該對(duì)象包含可應(yīng)用于數(shù)據(jù)庫的所有操作命令,操作命令也可以是存儲(chǔ)過程調(diào)用、Update語句或返回結(jié)果的語句。還可將輸入和輸出參數(shù)以及返回值用作命令語法的一部分。 Command對(duì)象有兩種形式: OleDbCommand用于ADO Managed
18、 Proider支持的數(shù)據(jù)源。 SqlCommand用于SQL Server數(shù)據(jù)庫。 Command對(duì)象的公共屬性如表19.11所示。 Command對(duì)象的公共方法見表19.12所示。 下面的語句說明如何對(duì)數(shù)據(jù)庫發(fā)出Insert語句(以sqlCommand為例)。 SqlConnection myConnection = new SqlConnection(Server=myservername; Database=northwind;uid=myuser;pwd=mypassword); SqlCommand mySqlCommand = new SqlCommand(Insert into
19、 表名 (字段名1, 字段名2, 字段名3, 字段名4,) Values (值1, 值2, 值3, 值4,), myConnection); myConnection.Open(); mySqlCommand.ExecuteNonQuery(); myConnection.Close();,19.1.2 ADO.NET的數(shù)據(jù)訪問對(duì)象,表19.11 公共屬性,19.1.2 ADO.NET的數(shù)據(jù)訪問對(duì)象,表19.12 公共方法,19.1.2 ADO.NET的數(shù)據(jù)訪問對(duì)象,4. DataReader對(duì)象 在ADO技術(shù)中,當(dāng)Recordset對(duì)象要讀1000行數(shù)據(jù)庫記錄時(shí),必須為這1000行記錄分配內(nèi)
20、存,并且一直“連接”直至連接的生命周期結(jié)束。這樣,如果有1000個(gè)用戶在同一時(shí)間對(duì)這同一臺(tái)計(jì)算機(jī)進(jìn)行同樣的操作,則內(nèi)存將被過度使用。為解決這一問題,ADO.NET新增了DataReader對(duì)象,DataReader對(duì)象以只讀、只向前的方式提供了一種快速讀取數(shù)據(jù)庫數(shù)據(jù)的方式,該對(duì)象僅與數(shù)據(jù)庫建立一個(gè)只讀的且僅向前的數(shù)據(jù)流,并在當(dāng)前內(nèi)存中每次僅存放一條記錄,所以DataReader對(duì)象可用于只需讀取一次的數(shù)據(jù),即可用于一次性地滾動(dòng)讀取數(shù)據(jù)庫數(shù)據(jù)。因此,使用DataReader可提高應(yīng)用程序的性能,并減少系統(tǒng)開銷。 創(chuàng)建SqlDataReader對(duì)象必須調(diào)用 SqlCommand 對(duì)象的Execut
21、eReader方法,下面是它的一些重要的公共屬性和方法。 DataReader對(duì)象的公共屬性如表19.13所示。 DataReader對(duì)象的公共方法如表19.14所示。 當(dāng)創(chuàng)建 Command 對(duì)象的實(shí)例后,可調(diào)用Command.ExecuteReader 從數(shù)據(jù)源中檢索行,從而創(chuàng)建一個(gè) DataReader對(duì)象,如以下示例所示。 SqlConnection myConnection = new SqlConnection(Server=myservername; Database=northwind; uid=myuser;pwd=mypassword); SqlCommand mySqlC
22、ommand = new SqlCommand(select * from 表名, mySqlConnection); mySqlConnection.Open(); myReader = mySqlCommand.ExecuteReader(); DataReader 提供未緩沖的數(shù)據(jù)流,該數(shù)據(jù)流使過程邏輯可以有效地按順序處理從數(shù)據(jù)源中返回的結(jié)果。由于數(shù)據(jù)不在內(nèi)存中緩存,所以在檢索大量數(shù)據(jù)時(shí),DataReader 是一種適合的選擇。每次使用完DataReader對(duì)象后都應(yīng)調(diào)用Close方法。 如果Command包含輸出參數(shù)或返回值,那么在 DataReader 關(guān)閉之前,將無法訪問這些輸出參
23、數(shù)或返回值。,19.1.2 ADO.NET的數(shù)據(jù)訪問對(duì)象,表19.13 公共屬性,19.1.2 ADO.NET的數(shù)據(jù)訪問對(duì)象,表19.14 公共方法,19.1.2 ADO.NET的數(shù)據(jù)訪問對(duì)象,5. DataAdapter 對(duì)象 DataAdapter 對(duì)象在 DataSet 與源數(shù)據(jù)之間起到橋梁的作用。DataAdapter對(duì)象使用Fill()方法將數(shù)據(jù)填充到DataSet的DataTable中去,并提供將異動(dòng)的數(shù)據(jù)更新到數(shù)據(jù)源的能力。 DataAdapter 對(duì)象為我們隱藏了與Connection和Command 對(duì)象溝通的細(xì)節(jié)。DataAdapter 使用 Connection 來連接數(shù)
24、據(jù)源并取出數(shù)據(jù),使用 Command 對(duì)象從數(shù)據(jù)源中檢索數(shù)據(jù)并將更改保存到數(shù)據(jù)源中。在使用 Microsoft SQL Server 數(shù)據(jù)庫時(shí),使用數(shù)據(jù)提供程序特定的 SqlDataAdapter(以及與其關(guān)聯(lián)的 SqlCommand 和 SqlConnection)能夠提高整體性能。對(duì)于其他支持 OLE DB 的數(shù)據(jù)庫,則使用 OleDbDataAdapter 對(duì)象及其關(guān)聯(lián) OleDbCommand 和 OleDbConnection 對(duì)象。 DataAdapter 對(duì)象提供了一組屬性,用于將數(shù)據(jù)庫中的數(shù)據(jù)填充至DataSet,即將數(shù)據(jù)從DataSet更新到數(shù)據(jù)庫。下面是它的一些重要的公共屬
25、性和方法。,19.2 ADO.NET訪問常用數(shù)據(jù)庫,19.2.1 SQL Server 2000 19.2.2 Oracle 19.2.3 Access,19.2 ADO.NET訪問常用數(shù)據(jù)庫,在C#中數(shù)據(jù)庫訪問主要采用ADO.NET技術(shù),利用ADO.NET技術(shù)可以訪問各種類型的數(shù)據(jù)庫,本小節(jié)介紹C#對(duì)常用數(shù)據(jù)庫的訪問技術(shù)。 本小節(jié)要介紹的數(shù)據(jù)庫包括以下幾個(gè): SQL Server 2000 Oracle Access 在數(shù)據(jù)訪問(Data access)中,最主要的也是首先要做的就是建立應(yīng)用程序與數(shù)據(jù)源的連接。本教程對(duì)數(shù)據(jù)庫連接方法進(jìn)行詳細(xì)講解。,19.2.1 SQL Server 2000
26、,SQL Server數(shù)據(jù)庫是在C#數(shù)據(jù)庫應(yīng)用程序開發(fā)過程常用的數(shù)據(jù)庫,可以通過以下方式訪問SQL Server數(shù)據(jù)庫: SqlConnection OleDbConnection,19.2.1 SQL Server 2000,1.SqlConnection SqlConnection是ADO.NET中專門針對(duì)SQL Server數(shù)據(jù)庫的訪問通道,利用SqlConnection方式訪問SQL Server數(shù)據(jù)比其他方式訪問速度更快。,19.2.1 SQL Server 2000,2. OleDbConnection 根據(jù)SQL Server數(shù)據(jù)庫身份驗(yàn)證方式的不同對(duì)應(yīng)不同的連接字符串。,19.
27、2.2 Oracle,Oracle是一個(gè)多用戶的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),可以運(yùn)行在多種工作站和微型計(jì)算機(jī)上。在大型項(xiàng)目中經(jīng)常使用Oracle數(shù)據(jù)庫。可以使用以下方式訪問Oracle數(shù)據(jù)庫: OracleConnection OleDbConnection,19.2.2 Oracle,1OracleConnection 在安裝了Oracle數(shù)據(jù)庫的計(jì)算機(jī)上開發(fā).NET應(yīng)用程序,會(huì)有OracleConnection對(duì)象。與SqlConnection類似,OracleConnection是ADO.NET中專門針對(duì)Oracle數(shù)據(jù)庫的訪問通道。采用OracleConnection方式連接Oracle數(shù)據(jù)
28、庫時(shí),連接字符串如下: Data Source=MyOracleDB;User Id=myUsername;Password= myPassword;Integrated Security=no;,19.2.2 Oracle,【例19.3】用OracleConnection連接Oracle數(shù)據(jù)庫 OracleConnection myOracleConnection=new OracleConnection(Data Source=MyOracleDB;User Id=myUsername;Password= myPassword;Integrated Security=no;); MyOra
29、cleConnection.Open(); /打開連接 MyOracleConnection.Close(); /關(guān)閉連接,19.2.2 Oracle,2OleDbConnection 采用OleDbConnection方式連接Oracle數(shù)據(jù)庫時(shí),連接字符串如下: Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=myUsername;Password=myPassword; 【例19.4】用OleDbConnection連接Oracle數(shù)據(jù)庫 OleDbConnection myOleDbConnection=new OleDb
30、Connection(Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;); MyOleDbConnection.Open(); /打開連接 MyOleDbConnection.Close(); /關(guān)閉連接,19.2.3 Access,Access是Microsoft Office家族的一個(gè)成員之一,它是基于SQL的關(guān)系型數(shù)據(jù)庫,功能強(qiáng)大、使用方便,常常用于小型項(xiàng)目中。在.Net中使用Access數(shù)據(jù)庫只能通過OleDbConnection方式連接,連接字符串如下: Pr
31、ovider=Microsoft.Jet.OLEDB.4.0;Data Source=somepathmydb.mdb; ,19.2.3 Access,【例19.5】用OleDbConnection連接Access數(shù)據(jù)庫 OleDbConnection myOleDbConnection=new OleDbConnection(Provider=Microsoft.Jet.OLEDB.4.0; DataSource=mypathmyfile.mdb; ); MyOleDbConnection.Open(); /打開連接 MyOleDbConnection.Close(); /關(guān)閉連接 即“Pr
32、ovider=Microsoft.Jet.OLEDB.4.0;DataSource=mypathmyfile.mdb; ”,19.3 C#數(shù)據(jù)庫的Windows編程,本節(jié)將數(shù)據(jù)庫應(yīng)用與Windows Forms結(jié)合,以講述C#數(shù)據(jù)庫的Windows編程編程技術(shù)。 【例19.6】在這一節(jié),我們將通過一個(gè)小例子來討論在C#中如何應(yīng)用ADO.NET對(duì)數(shù)據(jù)庫進(jìn)行基本操作:添加新記錄、編輯已有的記錄、刪除已有的記錄和數(shù)據(jù)間的導(dǎo)航。 (1)首先要建立一個(gè)數(shù)據(jù)庫,這個(gè)數(shù)據(jù)庫就是我們所說的數(shù)據(jù)源。我們可以建立一個(gè)access數(shù)據(jù)庫或者一個(gè)sql server。 數(shù)據(jù)庫名:sjData 表名:Student 字
33、段名:Sno,F(xiàn)irstName,LastName,Score (2)用VS .NET建立一個(gè)新的項(xiàng)目,名為TEN。 (3)在窗體上放置4個(gè)標(biāo)簽控件和4個(gè)文本框控件與表中的每個(gè)字段相對(duì)應(yīng),以及4個(gè)記錄間導(dǎo)航按鈕,還有6個(gè)按鈕分別為【添加】、【刪除】、【編輯】、【更新】、【放棄】和【關(guān)閉】(【更新】和【放棄】按鈕開始不可見,當(dāng)用戶單擊【編輯】或【添加】按鈕后才可見),如圖19.3所示。,19.3 C#數(shù)據(jù)庫的Windows編程,圖19.3 窗體上放置4個(gè)標(biāo)簽控件和4個(gè)文本框控件,19.3 C#數(shù)據(jù)庫的Windows編程,(4)按鈕功能介紹: 【關(guān)閉】:用來關(guān)閉窗體。 【添加】:允許你在文本框中輸
34、入數(shù)值,這時(shí)所有的按鈕是無效的,只有【更新】和【放棄】按鈕有效。當(dāng)用戶在文本框中輸入數(shù)值后,可以單擊【更新】按鈕添加記錄或單擊【放棄】按鈕放棄操作。 【編輯】:允許編輯已存在的記錄。 【刪除】:允許刪除已存在的記錄。 【更新】:當(dāng)用戶單擊【編輯】或【添加】按鈕時(shí)有效。 【放棄】:當(dāng)用戶單擊【編輯】或【添加】按鈕時(shí)有效。 (5)從【工具箱】的【數(shù)據(jù)】項(xiàng)選擇SqlDataAdapter用鼠標(biāo)拖拽到窗體上,窗體上將出現(xiàn)【數(shù)據(jù)適配器配置向?qū)А拷缑?,如圖19.4所示。 (6)單擊【下一步】按鈕進(jìn)入下一個(gè)界面,選擇需要連接的數(shù)據(jù)庫,這里選擇sjData數(shù)據(jù)庫,如圖19.5所示。 (7)再單擊【下一步】按鈕
35、,進(jìn)入第三個(gè)界面,【選擇查詢類型】,我們選擇第一項(xiàng):【使用SQL語句】,如圖19.6所示。 (8)選擇默認(rèn)值,單擊【下一步】進(jìn)入下一個(gè)界面,生成SQL語句,如圖19.7所示。,19.3 C#數(shù)據(jù)庫的Windows編程,圖19.4 數(shù)據(jù)適配器配置向?qū)Ы缑?19.3 C#數(shù)據(jù)庫的Windows編程,圖19.5 選擇sjData數(shù)據(jù)庫,19.3 C#數(shù)據(jù)庫的Windows編程,圖19.6 選擇查詢類型,19.3 C#數(shù)據(jù)庫的Windows編程,圖19.7 生成SQL語句,19.3 C#數(shù)據(jù)庫的Windows編程,(9)單擊【查詢生成器】按鈕,出現(xiàn)如圖19.8所示界面,選擇需要對(duì)其進(jìn)行操作的表,我們選
36、擇Student表,如圖19.8所示。 (10)單擊【添加】按鈕出現(xiàn)如圖19.9所示的界面。 (11)根據(jù)需要修改SQL查詢語句,本例為:select * from Student,然后單擊【確定】按鈕,如圖19.10所示。 (12)再單擊【下一步】按鈕,然后單擊【完成】按鈕。窗體下方添加了sqlConnection1和sqlDataAdapter1,如圖19.11所示。 sqlConnection1:建立一個(gè)到sjData數(shù)據(jù)的連接。 sqlDataAdapter1:數(shù)據(jù)適配器用于在數(shù)據(jù)集與數(shù)據(jù)庫之間交換數(shù)據(jù),并且從數(shù)據(jù)源向數(shù)據(jù)集填充數(shù)據(jù)??梢圆榭碨qlDataAdapter1的屬性窗口的一
37、些屬性: sqlSelectCommand1:負(fù)責(zé)執(zhí)行特定的選擇命令。 sqlInsertCommand1:負(fù)責(zé)執(zhí)行給定的插入命令。 sqlDeleteCommand1:負(fù)責(zé)執(zhí)行給定的刪除命令。 sqlUpdateCommand1: 負(fù)責(zé)執(zhí)行給定的更新命令。,19.3 C#數(shù)據(jù)庫的Windows編程,圖19.8 查詢生成器,19.3 C#數(shù)據(jù)庫的Windows編程,圖19.9 鍵入SQL命令的窗口,19.3 C#數(shù)據(jù)庫的Windows編程,圖19.10 生成的sql語句,19.3 C#數(shù)據(jù)庫的Windows編程,圖19.11 運(yùn)行結(jié)果,19.3 C#數(shù)據(jù)庫的Windows編程,(13)在窗體上
38、選中sqlDataAdapter1,右擊,在彈出菜單中選擇【生成數(shù)據(jù)集】命令,出現(xiàn)如圖19.12所示的界面。 數(shù)據(jù)集DataSet包括Student表中的數(shù)據(jù)。單擊【確定】按鈕,數(shù)據(jù)集DataSet11出現(xiàn)在窗體下方。 (14)對(duì)文本框到表中適當(dāng)字段的數(shù)據(jù)進(jìn)行綁定: 選擇文本框txtSNo并且在【屬性】對(duì)話框單擊數(shù)據(jù)綁定屬性集DataBindings左側(cè)的,然后選擇文本屬性Text項(xiàng),單擊按鈕,出現(xiàn)如圖19.13所示結(jié)果。 (15)選擇與其對(duì)應(yīng)的表的字段SNo,這樣就將文本框txtSNo與字段SNo進(jìn)行綁定了。 (16)按照以上步驟對(duì)其他文本框與對(duì)應(yīng)的字段進(jìn)行綁定。 或者通過代碼綁定: thi
39、s.txtSNo.DataBindings.Add(new System.Windows.Forms.Binding(Text, this.dataSet11, Student.SNo); (17)下面對(duì)各個(gè)按鈕添加相應(yīng)的代碼。 【加載】按鈕,將數(shù)據(jù)庫中的數(shù)據(jù)加載到窗體上的文本框中,程序代碼如下所示。,19.3 C#數(shù)據(jù)庫的Windows編程,private void button1_Click(object sender, System.EventArgs e) this.txtSNo.DataBindings.Add(new System.Windows.Forms.Binding(Tex
40、t, this.dataSet11, Student.SNo);/將表中數(shù)據(jù)綁定到相應(yīng)文本框 this.txtFName.DataBindings.Add(new System.Windows.Forms.Binding(Text, this.dataSet11, Student.FirstName); this.txtLName.DataBindings.Add(new System.Windows.Forms.Binding(Text, this.dataSet11, Student.LastName); this.txtScore.DataBindings.Add(new System.
41、Windows.Forms.Binding(Text, this.dataSet11, Student.Score); sqlDataAdapter1.Fill(dataSet11,Student); ,19.3 C#數(shù)據(jù)庫的Windows編程,圖19.12 生成DataSet數(shù)據(jù)集,19.3 C#數(shù)據(jù)庫的Windows編程,圖19.13 對(duì)文本框到表中適當(dāng)?shù)淖侄蔚臄?shù)據(jù)進(jìn)行綁定,19.3 C#數(shù)據(jù)庫的Windows編程,記錄間導(dǎo)航按鈕:可以控制數(shù)據(jù)向前或向后瀏覽。程序代碼如下: 【第一個(gè)】按鈕 private void btnmf_Click(object sender, System.Eve
42、ntArgs e) this.BindingContextdataSet11,Student.Position=0; /移動(dòng)到第一個(gè)記錄 【最后一個(gè)】按鈕 private void btnml_Click(object sender, System.EventArgs e) this.BindingContextdataSet11,Student.Position=this.BindingContextdataSet11,Student.Count-1; /移動(dòng)到最后一個(gè)記錄 【下一個(gè)】按鈕 private void btnmn_Click(object sender, System.Even
43、tArgs e) this.BindingContextdataSet11,Student.Position+=1; /移動(dòng)到下一個(gè)記錄 【前一個(gè)】按鈕 private void btnmp_Click(object sender, System.EventArgs e) this.BindingContextdataSet11,Student.Position-=1; / 移動(dòng)到前一個(gè)記錄,19.3 C#數(shù)據(jù)庫的Windows編程,【刪除】按鈕 /刪除一個(gè)已存在的記錄 private void btnDelete_Click(object sender, System.EventArgs e
44、) if(MessageBox.Show(你想刪除記錄嗎?,刪除,System.Windows.Forms.MessageBoxButtons.YesNo,System.Windows.Forms.MessageBoxIcon.Warning)=DialogResult.Yes) DataRow dr;/ 刪除一個(gè)已存在的記錄int vSNo=Int32.Parse(txtSNo.Text);dr=dataSet11.TablesStudent.Rows.Find(vSNo)dr.Delete();try sqlDataAdapter1.Update(dataSet11,Student);/更
45、新表 catch(Exception ex) MessageBox.Show(ex.Message);,19.3 C#數(shù)據(jù)庫的Windows編程,【添加】按鈕:把文本框清空,以便輸入新數(shù)據(jù),并使【更新】按鈕可見。 private void btnAdd_Click(object sender, System.EventArgs e) btnAdd.Visible =false; btnEdit.Visible =false; btnDelete.Enabled =false; btnClose.Enabled=false; btnmf.Enabled=false; btnml.Enabled=
46、false; btnmn.Enabled=false; btnmp.Enabled=false; btnUpdate.Visible=true; btnCancel.Visible=true; txtSNo.Text=;/清空文本框 txtFName.Text=; txtLName.Text=; txtScore.Text=; txtSNo.Focus(); AddUpdate=true;/ 使【更新】按鈕可見 ,19.3 C#數(shù)據(jù)庫的Windows編程,【編輯】按鈕:把光標(biāo)指向txtSNo文本框,并且在數(shù)據(jù)庫表Student中找到要更新的相應(yīng)“學(xué)號(hào)”。 private void btnEdi
47、t_Click(object sender, System.EventArgs e) btnAdd.Visible =false; btnEdit.Visible =false; btnDelete.Enabled =false; btnClose.Enabled=false; btnmf.Enabled=false; btnml.Enabled=false; btnmn.Enabled=false; btnmp.Enabled=false; btnUpdate.Visible=true; btnCancel.Visible=true; txtSNo.Focus();/把光標(biāo)指向txtSNo文
48、本框 AddUpdate=false; /在數(shù)據(jù)庫表Student中找到要更新相應(yīng)學(xué)號(hào)drUpdate=dataSet11.TablesStudent.Rows.Find(Int32.Parse(txtSNo.Text); ,19.3 C#數(shù)據(jù)庫的Windows編程,【更新】按鈕:當(dāng)用戶單擊【編輯】或【添加】按鈕時(shí)有效。 if(AddUpdate=true) try int vSNo=Int32.Parse(txtSNo.Text); /添加一個(gè)新記錄 int vScore=Int32.Parse(txtScore.Text); DataRow drAdd; drAdd=dataSet11.T
49、ablesStudent.NewRow(); drAdd0=vSNo; drAdd1=txtFName.Text; drAdd2=txtLName.Text; drAdd3=vScore; dataSet11.TablesStudent.Rows.Add(drAdd); sqlDataAdapter1.Update(dataSet11,Student); catch(Exception ex) MessageBox.Show(ex.Message); else try int vSNo=Int32.Parse(txtSNo.Text); /編輯一個(gè)已存在的記錄 int vScore=Int32
50、.Parse(txtScore.Text); drUpdate.BeginEdit(); drUpdateSNo=vSNo; drUpdateFirstName=txtFName.Text; drUpdateLastName=txtLName.Text; drUpdateScore=vScore; drUpdate.EndEdit(); sqlDataAdapter1.Update(dataSet11,Student); catch(Exception ex) MessageBox.Show(ex.Message); ,19.3 C#數(shù)據(jù)庫的Windows編程,(18)程序運(yùn)行結(jié)果如圖19.14所示。,圖19.14 程序運(yùn)行結(jié)果,19.4 C#數(shù)據(jù)庫的Web編程,下面用一個(gè)例子演示如何使用ADO.NET在Web應(yīng)用程序中訪問數(shù)據(jù)庫。這里使用Microsoft SQL Server 2000作為要訪問的數(shù)據(jù)庫。 【例19.7】新建一個(gè)ASP.NET Web應(yīng)用程序項(xiàng)目,命名為ADONETTEST。從【工具箱】中的【數(shù)據(jù)】欄內(nèi)選擇SqlConnection控件,將它拖入窗體中,在SqlConnection控件的屬性對(duì)話框中選擇ConnectionString屬性,在屬性項(xiàng)的下拉列表中選擇【新建連接】命令,這時(shí)將彈出【數(shù)據(jù)鏈接屬性】對(duì)話框(圖19.15)。 在該對(duì)話框的設(shè)置項(xiàng)1中
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 城市垃圾處理塔吊施工協(xié)議
- 航空航天安全承諾書
- 網(wǎng)絡(luò)管理員聘用合同樣本
- 煤礦開采回填土施工合同
- 政務(wù)服務(wù)設(shè)施無障礙
- 學(xué)生入學(xué)協(xié)議書
- 教育培訓(xùn)機(jī)構(gòu)教師聘用合同書
- 建筑施工合同:體育館建設(shè)協(xié)議
- 2022年大學(xué)環(huán)境生態(tài)專業(yè)大學(xué)物理二期中考試試卷C卷-含答案
- 礦山通信室外施工合同
- 胸腰椎壓縮骨折中醫(yī)治療難點(diǎn)及解決思路和措施
- 急性缺血性腦卒中血管內(nèi)治療流程圖
- 高中英語高考讀后續(xù)寫動(dòng)作描寫素材(手上動(dòng)作+腳上動(dòng)作+笑的動(dòng)作)
- 2022-2023學(xué)年天津市高二(上)期末物理試卷、答案解析(附后)
- 氣管切開術(shù)及環(huán)甲膜穿刺術(shù)演示文稿
- 中華詩詞學(xué)會(huì)會(huì)員登記表上網(wǎng)
- 煙葉分級(jí)知識(shí)考試題庫(含答案)
- 中建三局施工現(xiàn)場安全防護(hù)標(biāo)準(zhǔn)化圖冊(cè)
- 變應(yīng)性支氣管肺曲霉病ABPA中國專家共識(shí)
- 結(jié)節(jié)病課件完整版
- 用電安全專項(xiàng)檢查表
評(píng)論
0/150
提交評(píng)論