C與數(shù)據(jù)庫訪問技術(shù)說課材料_第1頁
C與數(shù)據(jù)庫訪問技術(shù)說課材料_第2頁
C與數(shù)據(jù)庫訪問技術(shù)說課材料_第3頁
C與數(shù)據(jù)庫訪問技術(shù)說課材料_第4頁
C與數(shù)據(jù)庫訪問技術(shù)說課材料_第5頁
已閱讀5頁,還剩135頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。C與數(shù)據(jù)庫訪問技術(shù)TOCo1-3hzuHYPERLINKl_Toc2318243002.1ADO.NET概述PAGEREF_Toc231824300h2HYPERLINKl_Toc2318243012.1.1ADO.NET體系結(jié)構(gòu)PAGEREF_Toc231824301h2HYPERLINKl_Toc2318243022.1.2ADO.NET對象模型PAGEREF_Toc231824302h3HYPERLINKl_Toc2318243032.2Connection對象與數(shù)據(jù)庫連接PAGEREF_Toc2

2、31824303h4HYPERLINKl_Toc2318243042.2.1Connection對象的常用屬性PAGEREF_Toc231824304h4HYPERLINKl_Toc2318243052.2.2Connection對象的連接字符串PAGEREF_Toc231824305h5HYPERLINKl_Toc2318243062.2.3Connection對象的常用方法PAGEREF_Toc231824306h7HYPERLINKl_Toc2318243072.3Command(數(shù)據(jù)命令)對象與查詢語句PAGEREF_Toc231824307h10HYPERLINKl_Toc23182

3、43082.3.1Command對象的常用屬性PAGEREF_Toc231824308h11HYPERLINKl_Toc2318243092.3.2Command對象的常用方法PAGEREF_Toc231824309h11HYPERLINKl_Toc2318243102.3.3Command對象創(chuàng)建SQl語句代碼示例PAGEREF_Toc231824310h14HYPERLINKl_Toc231824311綜合示例PAGEREF_Toc231824311h15HYPERLINKl_Toc2318243124.4.2實(shí)例演示DataReaderPAGEREF_Toc231824312h29HYP

4、ERLINKl_Toc2318243132.4DataReader對象與數(shù)據(jù)獲取PAGEREF_Toc231824313h32HYPERLINKl_Toc2318243142.4.1DataReader對象的常用屬性PAGEREF_Toc231824314h32HYPERLINKl_Toc2318243152.4.2DataReader對象的常用方法PAGEREF_Toc231824315h32HYPERLINKl_Toc2318243162.4.3DataReader對象訪問數(shù)據(jù)庫代碼示例PAGEREF_Toc231824316h33HYPERLINKl_Toc2318243172.5Dat

5、aAdaDter對象PAGEREF_Toc231824317h35HYPERLINKl_Toc2318243182.5.1DataAdapter對象的常用屬性PAGEREF_Toc231824318h35HYPERLINKl_Toc2318243192.5.2DataAdapter對象的常用方法PAGEREF_Toc231824319h36HYPERLINKl_Toc2318243202.5.3DataAdapter對象代碼示例PAGEREF_Toc231824320h37HYPERLINKl_Toc2318243212.6DataSet對象PAGEREF_Toc231824321h39HYP

6、ERLINKl_Toc2318243222.6.1DataSet對象概述PAGEREF_Toc231824322h39HYPERLINKl_Toc2318243232.6.2DataSet對象模型PAGEREF_Toc231824323h39HYPERLINKl_Toc2318243242.6.3DataCOIumn和DataRow對象PAGEREF_Toc231824324h41HYPERLINKl_Toc2318243252.6.4使用DataSet對象訪問數(shù)據(jù)庫PAGEREF_Toc231824325h44HYPERLINKl_Toc2318243262.7ADO.NET代碼綜合示例PA

7、GEREF_Toc231824326h45HYPERLINKl_Toc2318243272.7.1使用OLEDB.NETProviderPAGEREF_Toc231824327h45HYPERLINKl_Toc2318243282.7.2使用SQLServer.NETProviderPAGEREF_Toc231824328h46HYPERLINKl_Toc2318243292.7.3數(shù)據(jù)庫訪問綜述PAGEREF_Toc231824329h47HYPERLINKl_Toc2318243302.8DataGrid控件與數(shù)據(jù)庫訪問技術(shù)PAGEREF_Toc231824330h47HYPERLINKl

8、_Toc2318243312.8.1DataGrid控件與數(shù)據(jù)綁定PAGEREF_Toc231824331h47HYPERLINKl_Toc2318243322.8.2DataGrid代碼示例PAGEREF_Toc231824332h48HYPERLINKl_Toc2318243332.9本章小結(jié)PAGEREF_Toc231824333h49C#與數(shù)據(jù)庫訪問技術(shù)ADO.NET(ActiveXDataObject.NET)是Microsoft公司開發(fā)的用于數(shù)據(jù)庫連接的一套組件模型,是ADO的升級版本。由于ADO.NET組件模型很好地融入了.NETFramework,所以擁有.NETFramewo

9、rk的平臺無關(guān)、高效等特性。程序員能使用ADO.NET組件模型,方便高效地連接和訪問數(shù)據(jù)庫。1ADO.NET概述ADO.NET是與數(shù)據(jù)庫訪問操作有關(guān)的對象模型的集合,它基于Microsoft的.NETFramework,在很大程度上封裝了數(shù)據(jù)庫訪問和數(shù)據(jù)操作的動作。ADO.NET同其前身ADO系列訪問數(shù)據(jù)庫的組件相比,做了以下兩點(diǎn)重要改進(jìn):ADO.NET引入了離線的數(shù)據(jù)結(jié)果集(DisconnectedDataSet)這個概念,通過使用離線的數(shù)據(jù)結(jié)果集,程序員更可以在數(shù)據(jù)庫斷開的情況下訪問數(shù)據(jù)庫。ADO.NET還提供了對XML格式文檔的支持,所以通過ADO.NET組件可以方便地在異構(gòu)環(huán)境的項(xiàng)目間

10、讀取和交換數(shù)據(jù)。1.1ADO.NET體系結(jié)構(gòu)ADO.NET組件的表現(xiàn)形式是.NET的類庫,它擁有兩個核心組件:.NETDataProvider(數(shù)據(jù)提供者)和DataSet(數(shù)據(jù)結(jié)果集)對象。.NETDataProvider是專門為數(shù)據(jù)處理以及快速地只進(jìn)、只讀訪問數(shù)據(jù)而設(shè)計(jì)的組件,包括Connection、Command、DataReader和DataAdapter四大類對象,其主要功能是:在應(yīng)用程序里連接數(shù)據(jù)源,連接SQLServer數(shù)據(jù)庫服務(wù)器。通過SQL語句的形式執(zhí)行數(shù)據(jù)庫操作,并能以多種形式把查詢到的結(jié)果集填充到DataSet里。DataSet對象是支持ADO.NET的斷開式、分布式數(shù)

11、據(jù)方案的核心對象。DataSet是數(shù)據(jù)的內(nèi)存駐留表示形式,無論數(shù)據(jù)源是什么,它都會提供一致的關(guān)系編程模型。它是專門為獨(dú)立于任何數(shù)據(jù)源的數(shù)據(jù)訪問而設(shè)計(jì)的。DataSet對象的主要功能是:用其中的DataTable和DataRelations對象來容納.NETDataProvider對象傳遞過來的數(shù)據(jù)庫訪問結(jié)果集,以便應(yīng)用程序訪問。(2)把應(yīng)用代碼里的業(yè)務(wù)執(zhí)行結(jié)果更新到數(shù)據(jù)庫中。并且,DataSet對象能在離線的情況下管理存儲數(shù)據(jù),這在海量數(shù)據(jù)訪問控制的場合是非常有利的。圖2-1描述了ADO.NET組件的體系結(jié)構(gòu)。圖2-1ADO.NET體系結(jié)構(gòu)1.2ADO.NET對象模型ADO.NET對象模型中有

12、5個主要的數(shù)據(jù)庫訪問和操作對象,分別是Connection、Command、DataReader、DataAdapter和DataSet對象。其中,Connection對象主要負(fù)責(zé)連接數(shù)據(jù)庫,Command對象主要負(fù)責(zé)生成并執(zhí)行SQL語句,DataReader對象主要負(fù)責(zé)讀取數(shù)據(jù)庫中的數(shù)據(jù),DataAdapter對象主要負(fù)責(zé)在Command對象執(zhí)行完SQL語句后生成并填充DataSet和DataTable,而DataSet對象主要負(fù)責(zé)存取和更新數(shù)據(jù)。ADO.NET主要提供了兩種數(shù)據(jù)提供者(DataProvider),分別是SQLServer.NETProvider和OLEDB.NETProvi

13、der。SQLServer.NETFramework數(shù)據(jù)提供程序使用它自身的協(xié)議與SQLServer數(shù)據(jù)庫服務(wù)器通信,而OLEDB.NETFramework則通過OLEDB服務(wù)組件(提供連接池和事務(wù)服務(wù))和數(shù)據(jù)源的OLEDB提供程序與OLEDB數(shù)據(jù)源進(jìn)行通信。它們兩者內(nèi)部均有Connection、Command、DataReader和DataAdapter4類對象。對于不同的數(shù)據(jù)提供者,上述4種對象的類名是不同的,而它們連接訪問數(shù)據(jù)庫的過程卻大同小異。這是因?yàn)樗鼈円越涌诘男问?,封裝了不同數(shù)據(jù)庫的連接訪問動作。正是由于這兩種數(shù)據(jù)提供者使用數(shù)據(jù)庫訪問驅(qū)動程序屏蔽了底層數(shù)據(jù)庫的差異,所以從用戶的角度

14、來看,它們的差別僅僅體現(xiàn)在命名上。表2-1描述了這兩類數(shù)據(jù)提供者下的對象命名。表2-1ADO.NET對象描述對象名OLEDB數(shù)據(jù)提供者的類名SQLServer數(shù)據(jù)提供者類名Connection對象OleDbConnectionSqlConnectionCommand對象OleDbCommandSqlCommandDataReader對象OleDbDataReaderSqlDataReaderDataAdapter對象OleDbDataAdapterSqlDataAdapter2.2Connection對象與數(shù)據(jù)庫連接在不同的Provider類型下,Connection對象的命名也是不同的,但它

15、們有一個共同的功能,那就是管理與數(shù)據(jù)源的連接。2.2.1Connection對象的常用屬性Connectionion對象主要用于連接數(shù)據(jù)庫,它的常用的屬性如下。ConnectionString屬性:該屬性用來獲取或設(shè)置用于打開SQLServer數(shù)據(jù)庫的字符串。ConnectionTimeout屬性:該屬性用來獲取在嘗試建立連接時(shí)終止嘗試,并生成錯誤之前所等待的時(shí)間。DataBase屬性:該屬性用來獲取當(dāng)前數(shù)據(jù)庫或連接打開后要使用的數(shù)據(jù)庫的名稱。DataSource屬性:該屬性用來設(shè)置要連接的數(shù)據(jù)源實(shí)例名稱,例如SQLServer的Local服務(wù)實(shí)例。State性該屬性:是一個枚舉類型的值,用來

16、表示同當(dāng)前數(shù)據(jù)庫的連接狀態(tài)。該屬性的取值情況和含義如表2-2所示。表2-2Provider值描述(ConnectionSate枚舉成員值)屬性值對應(yīng)含義Broken該連接對象與數(shù)據(jù)源的連接處于中斷狀態(tài)。只有當(dāng)連接打開后再與數(shù)據(jù)庫失去連接才會導(dǎo)致這種情況??梢躁P(guān)閉處于這種狀態(tài)的連接,然后重新打開(該值是為此產(chǎn)品的未來版本保留的)Closed該連接處于關(guān)閉狀態(tài)Connecting該連接對象正在與數(shù)據(jù)源連接(該值是為此產(chǎn)品的未來版本保留的)Executing該連接對象正在執(zhí)行數(shù)據(jù)庫操作的命令Fetching該連接對象正在檢索數(shù)據(jù)Open該連接處于打開狀態(tài)State屬性一般是只讀不寫的,以下代碼演示了

17、使用State屬性管理控制數(shù)據(jù)連接的方式。/設(shè)置連接對象SqlConnectionconn;/如果是空閑狀態(tài),連接數(shù)據(jù)庫if(conn.State=ConnectionState.Closed)conn.Open();/訪問數(shù)據(jù)庫的代碼/最后關(guān)閉連接if(conn.State=ConnectionState.Open)conn.Close();2.2.2Connection對象的連接字符串在ConnectionString連接字符串里,一般需要指定將要連接數(shù)據(jù)源的種類、數(shù)據(jù)庫服務(wù)器的名稱、數(shù)據(jù)庫名稱、登錄用戶名、密碼、等待連接時(shí)間、安全驗(yàn)證設(shè)置等參數(shù)信息,這些參數(shù)之間用分號隔開。下面將詳細(xì)描述

18、這些常用參數(shù)的使用方法。1.Provider參數(shù)Provider參數(shù)用來指定要連接數(shù)據(jù)源的種類。如果使用的是SQLServerDatahovider,則不需要指定Provider參數(shù),因?yàn)镾QLServerDataProvider已經(jīng)指定了所要連接的數(shù)據(jù)源是SQlServer服務(wù)器。如果使用的是O1eDBDataProvider或其他連接數(shù)據(jù)庫,則必須指定Provider參數(shù)。表2-3說明了Provider參數(shù)值和連接數(shù)據(jù)源類型之間的關(guān)系。表2-3Provider值描述Provider值對應(yīng)連接的數(shù)據(jù)源SQLOLEDBMicrosoftOLEDBProviderforSQLServerMSDA

19、SQLMicrosoftOLEDBProviderforODBCMicrosoft.Jet.OLEDB.4.0MicrosoftOLEDBProviderforAccessMSDAORAMicrosoftOLEDBProviderforOracle2.Server參數(shù)Server參數(shù)用來指定需要連接的數(shù)據(jù)庫服務(wù)器(或數(shù)據(jù)域)。比如Server=(local),指定連接的數(shù)據(jù)庫服務(wù)器是在本地。如果本地的數(shù)據(jù)庫還定義了實(shí)例名,Server參數(shù)可以寫成Server=(local)實(shí)例名。另外,可以使用計(jì)算機(jī)名作為服務(wù)器的值。如果連接的是遠(yuǎn)端的數(shù)據(jù)庫服務(wù)器,Server參數(shù)可以寫成Server=IP或

20、“Server=遠(yuǎn)程計(jì)算機(jī)名”的形式。Server參數(shù)也可以寫成DataSource,比如DataSource=IP。server=(local);InitialCatalog=student;userId=sa;password=;DataSource=(localhost);InitialCatalog=student;userId=sa;password=;3.DataBase參數(shù)DataBase參數(shù)用來指定連接的數(shù)據(jù)庫名。比如DataBase=Master,說明連接的數(shù)據(jù)庫是Master,DataBase參數(shù)也可以寫成InitialCatalog,如InitialCatalog=Mas

21、ter。4.Uid參數(shù)和Pwd參數(shù)Uid參數(shù)用來指定登錄數(shù)據(jù)源的用戶名,也可以寫成UserID。比如Uid(UserID)=sa,說明登錄用戶名是sa。Pwd參數(shù)用來指定連接數(shù)據(jù)源的密碼,也可以寫成Password。比如Pwd(Password)=,說明登錄密碼是。5.ConnectTimeout參數(shù)ConnectTimeout參數(shù)用于指定打開數(shù)據(jù)庫時(shí)的最大等待時(shí)間,單位是秒。如果不設(shè)置此參數(shù),默認(rèn)是15秒。如果設(shè)置成-1,表示無限期等待,一般不推薦使用。6.IntegratedSecurity參數(shù)IntegratedSecurity參數(shù)用來說明登錄到數(shù)據(jù)源時(shí)是否使用SQLServer的集成安

22、全驗(yàn)證。如果該參數(shù)的取值是True(或SSPI,或Yes),表示登錄到SQLServer時(shí)使用Windows驗(yàn)證模式,即不需要通過Uid和Pwd這樣的方式登錄。如果取值是False(或No),表示登錄SQLServer時(shí)使用Uid和Pwd方式登錄。一般來說,使用集成安全驗(yàn)證的登錄方式比較安全,因?yàn)檫@種方式不會暴露用戶名和密碼。安裝SQLServer時(shí),如果選中“Windows身份驗(yàn)證模式”單選按鈕則應(yīng)該使用如下的連接字符串DataSource=(local);InitCatalog=students;IntegratedSecurity=SSPI;IntegratedSecurity=SSPI

23、表示連接時(shí)使用的驗(yàn)證模式是Windows身份驗(yàn)證模式。7.Pooling、MaxPoolSize和MinPoolSize參數(shù)Pooling參數(shù)用來說明在連接到數(shù)據(jù)源時(shí),是否使用連接池,默認(rèn)是True。當(dāng)該值為True時(shí),系統(tǒng)將從適當(dāng)?shù)某刂刑崛QLConnection對象,或在需要時(shí)創(chuàng)建該對象并將其添加到適當(dāng)?shù)某刂?。?dāng)取值為False時(shí),不使用連接池。當(dāng)應(yīng)用程序連接到數(shù)據(jù)源或創(chuàng)建連接對象時(shí),系統(tǒng)不僅要開銷一定的通信和內(nèi)存資源,還必須完成諸如建立物理通道(例如套接字或命名管道),與服務(wù)器進(jìn)行初次握手,分析連接字符串信息,由服務(wù)器對連接進(jìn)行身份驗(yàn)證,運(yùn)行檢查以便在當(dāng)前事務(wù)中登記等任務(wù),因此往往成為

24、最為耗時(shí)的操作。實(shí)際上,大多數(shù)應(yīng)用程序僅使用一個或幾個不同的連接配置。這意味著在執(zhí)行應(yīng)用程序期間,許多相同的連接將反復(fù)地打開和關(guān)閉。為了使打開的連接成本最低,ADO.NET使用稱為Pooling(即連接池)的優(yōu)化方法。在連接池中,為了提高數(shù)據(jù)庫的連接效率,根據(jù)實(shí)際情況,預(yù)先存放了若干數(shù)據(jù)庫連接對象,這些對象即使在用完后也不會被釋放。應(yīng)用程序不是向數(shù)據(jù)源申請連接對象,而是向連接池申請數(shù)據(jù)庫的連接對象。另外,連接池中的連接對象數(shù)量必須同實(shí)際需求相符,空置和滿載都對數(shù)據(jù)庫的連接效率不利。MaxPoolSize和MinPoolSize這兩個參數(shù)分別表示連接池中最大和最小連接數(shù)量,默認(rèn)分別是100和0。

25、根據(jù)實(shí)際應(yīng)用適當(dāng)?shù)厝≈祵⑻岣邤?shù)據(jù)庫的連接效率。8.綜合實(shí)例下面通過實(shí)例來說明連接字符串的具體含義。如果連接字符串是:Provider=Microsoft.Jet.OleDB.4.0;DataSource=D:login.mdb則說明數(shù)據(jù)源的種類是Microsoft.Jet.OleDB.4.0,數(shù)據(jù)源是D盤下的login.mdbAccess數(shù)據(jù)庫,用戶名和密碼均無。如果連接字符串是:Server=(local);DataBase=Master;Uid=sa;Pwd=;ConnectionTimeout=20由于沒有指定Provider,所以可以看出該連接字符串用于創(chuàng)建SqlConnection對

26、象,連接SQLServer數(shù)據(jù)庫。需連接的SQLServer數(shù)據(jù)庫服務(wù)器是local,數(shù)據(jù)庫是Master,用戶名是sa,密碼為空,而最大連接等待時(shí)間是20秒。2.2.3Connection對象的常用方法Connection類型的對象用來連接數(shù)據(jù)源。在不同的數(shù)據(jù)提供者的內(nèi)部,Connection對象的名稱是不同的,在SQLServerDataProvider里叫SqlConnection,而在OLEDBDataProvider里叫OleDbConnection。下面將詳細(xì)介紹Connection類型對象的常用方法。1.構(gòu)造函數(shù)構(gòu)造函數(shù)用來構(gòu)造Connection類型的對象。對于SqlConne

27、ction類,其構(gòu)造函數(shù)說明如表2-4所示。表2-4SqlConnection類構(gòu)造函數(shù)說明函數(shù)定義參數(shù)說明函數(shù)說明SqlConnection()不帶參數(shù)創(chuàng)建SqlConnection對象SqlConnection(stringconnectionstring)連接字符串根據(jù)連接字符串,創(chuàng)建SqlConnection對象第1種:StringConnectionString=”server=(local);InitialCatalog=stu;”;SqlConnectionconn=newSqlConnection();conn.ConnectionString=ConnectionString

28、;conn.Open();第2種Stringcnn=”server=(local);InitialCatalog=stu;”;SqlConnectionconn=newSqlConnection(cnn);conn.Open();顯然使用第2種方法輸入的代碼要少一點(diǎn),但是兩種方法執(zhí)行的效率并沒有什么不同,另外,如果需要重用Connection對象去使用不同的身份連接不同的數(shù)據(jù)庫時(shí),使用第一種方法則非常有效。例如:SqlConnectionconn=newSqlConnection();conn.ConnectionString=connectionString1;conn.Open();/訪問

29、數(shù)據(jù)庫,做一些事情conn.Close();conn.ConnectionString=connectionString2;conn.Open();/訪問數(shù)據(jù)庫,做另外一些事情conn.Close();注意:只有當(dāng)一個連接關(guān)閉以后才能把另一個不同的連接字符串賦值給Connection對象。如果不知道Connection對象在某個時(shí)候是打開是關(guān)閉時(shí),可以檢查Connection對象的State屬性,它的值可以是Open,也可以是Closed,這樣就可以知道連接是否是打開的。表2-5說明了OleDbConnection類的構(gòu)造函數(shù)??梢钥闯?,它們和SqlConnection類的構(gòu)造函數(shù)非常相近。表

30、2-5OleDbConnection類構(gòu)造函數(shù)說明函數(shù)定義參數(shù)說明函數(shù)說明OleDbConnection()不帶參數(shù)創(chuàng)建OleDbConnection對象OleDbConnection(stringconnectionstring)連接字符串根據(jù)連接字符串,創(chuàng)建OleDbConnection對象2.Open和Close方法Open和Close方法分別用來打開和關(guān)閉數(shù)據(jù)庫連接,都不帶參數(shù),均無返回值。Open方法:使用ConnectionString所指定的屬性設(shè)置打開數(shù)據(jù)庫連接Close方法:關(guān)閉與數(shù)據(jù)庫的連接,這是關(guān)閉任何打開連接的首選方法3.SqlCommand(OleDbCommand)

31、CreateCommand()方法SqlCommand(OleDbCommand)CreateCommand()方法用來創(chuàng)建一個Command類型的對象。Command類對象一般用來執(zhí)行SQL語句,關(guān)于Command對象的操作將在2.3節(jié)里詳細(xì)描述。CreateCommand()方法:創(chuàng)建并返回一個與SqlConnection關(guān)聯(lián)的SqlCommand對象ChangeDatabase方法:為打開的SqlConnection更改當(dāng)前數(shù)據(jù)庫。注意:數(shù)據(jù)庫連接是很有價(jià)值的資源,因?yàn)檫B接要使用到寶貴的系統(tǒng)資源,如內(nèi)存和網(wǎng)絡(luò)帶寬,因此對數(shù)據(jù)庫的連接必須小心使用,要在最晚的時(shí)候建立連接(調(diào)用Open方法)

32、,在最早的時(shí)候關(guān)閉連接(調(diào)用Close方法)。也就是說在開發(fā)應(yīng)用程序時(shí),不再需要數(shù)據(jù)連接時(shí)應(yīng)該立刻關(guān)閉數(shù)據(jù)連接。這點(diǎn)看起來很簡單,要達(dá)到這個目標(biāo)也不難,關(guān)鍵是要有這種意識。2.2.4Connection對象連接數(shù)據(jù)源代碼示例以下代碼演示使用連接字符串創(chuàng)建數(shù)據(jù)庫連接的一般方式。/連接Access數(shù)據(jù)庫stringconnStr=Provider=Microsoft.Jet.OleDB.4.0;DataSource=D:login.mdb/根據(jù)字符串創(chuàng)建OleDbConnection連接對象OleDbConnectionobjConnection=newOleDbConnection(strCon

33、nect);/打開數(shù)據(jù)源連接if(objConnection.State=ConnectionState.Closed)objConnection.Open();/使用結(jié)束后關(guān)閉數(shù)據(jù)源連接if(objConnection.State=ConnectionState.Open)objConnection.Close();在這段代碼里的業(yè)務(wù)邏輯是:(1)創(chuàng)建連接字符串,從中可以看出Connection對象是使用OleDB類型的DataProvider,連接到D盤下login.mdb的Access數(shù)據(jù)庫中。(2)根據(jù)連接字符串,創(chuàng)建Connection類型的對象,這里用到了OleDbConnecti

34、on。(3)打開數(shù)據(jù)源的連接。(4)執(zhí)行數(shù)據(jù)庫的訪問操作代碼。(5)關(guān)閉數(shù)據(jù)源連接。完整案例1、利用SQLServer2000建立一個數(shù)據(jù)庫Student,并建立相應(yīng)的表studentInfo2、用VisualC#2005建立一個基于Window的應(yīng)用程序,并添加一個按鈕,如圖下3、雙擊按鈕,自動切換到后臺代碼編輯文件Form1.cs中,并自動添加了與此按鈕的Click事件相關(guān)的處理程序button1_Click(objectsender,EventArgse)4、在Form1.cs文件中添加如下命名空間:usingSystem.Data.SqlClient;5、在事件處理程序button1_

35、Click中添加代碼:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Data.SqlClient;namespaceDataBasepublicpartialclassForm1:FormpublicForm1()InitializeComponent();privatevoidbutton1_Click(object

36、sender,EventArgse)trySqlConnectionconn=newSqlConnection();/conn.ConnectionString=server=(local);userid=sa;InitialCatalog=Student;pwd=;conn.ConnectionString=server=(local);InitialCatalog=Student;IntegratedSecurity=SSPI;conn.Open();if(conn.State=ConnectionState.Open)MessageBox.Show(連接已經(jīng)打開);conn.Close(

37、);if(conn.State=ConnectionState.Closed)MessageBox.Show(連接已經(jīng)關(guān)閉);catch(Exceptionex)MessageBox.Show(數(shù)據(jù)庫連接失敗+ex.Message);2.3Command(數(shù)據(jù)命令)對象與查詢語句建立了數(shù)據(jù)庫連接之后,就可以執(zhí)行數(shù)據(jù)訪問操作和數(shù)據(jù)操縱操作了。一般對數(shù)據(jù)庫的操作被概括為CRUDCreate、Read、Update和Delete。ADO.NET中定義了Command類去執(zhí)行這些操作。和Connection對象類似,在.NET中存在SqlCommand和OleDbCommand,除了OleDbComm

38、and類沒有ExecuteXmlReader方法之外,OleDbCommand與SqlCommand非常類似。Command對象主要用來執(zhí)行SQL語句。利用Command對象,可以查詢數(shù)據(jù)和修改數(shù)據(jù)。Command對象是由Connection對象創(chuàng)建的,其連接的數(shù)據(jù)源也將由Connection來管理。而使用Command對象的SQL屬性獲得的數(shù)據(jù)對象,將由DataReader和DataAdapter對象填充到DataSet里,從而完成對數(shù)據(jù)庫數(shù)據(jù)操作的工作。2.3.1Command對象的常用屬性Command對象的常用屬性有Connection、ConnectionString、Command

39、Type、CommandText和CommandTimeout。1.Connection屬性Connection屬性用來獲得或設(shè)置該Command對象的連接數(shù)據(jù)源。比如某SqlConnection類型的conn對象連在SQLServer服務(wù)器上,又有一個Command類型的對象cmd,可以通過cmd.Connection=conn來讓cmd在conn對象所指定的數(shù)據(jù)庫上操作。不過,通常的做法是直接通過Connection對象來創(chuàng)建Command對象,而Command對象不宜通過設(shè)置Connection屬性來更換數(shù)據(jù)庫,所以上述做法并不推薦。2.ConnectionString屬性Connect

40、ionString屬性用來獲得或設(shè)置連接數(shù)據(jù)庫時(shí)用到的連接字符串,用法和上述Connection屬性相同。同樣,不推薦使用該屬性來更換數(shù)據(jù)庫。3.CommandType屬性CommandType屬性用來獲得或設(shè)置CommandText屬性中的語句是SQL語句、數(shù)據(jù)表名還是存儲過程。該屬性的取值有3個:如果把CommandType設(shè)置成為Text或不設(shè)置,說明CommandText屬性的值是一個SQL語句。如果把CommandType設(shè)置成為TableDirect,說明CommandText屬性的值是一個要操作的數(shù)據(jù)表的名。(SQLServer.NET數(shù)據(jù)提供程序不支持該屬性值)如果把Comma

41、ndType設(shè)置成為StoredProcedure,說明CommandText屬性的值是一個存儲過程。如果不顯示設(shè)置CommandType的值,則CommandType默認(rèn)為Text。表CommandType枚舉值值說明StoredProcedure指示CommandType屬性的值為存儲過程的名稱TableDirect指示CommandType屬性的值為一個或多個表的名稱只有OLEDB的.NETFramework數(shù)據(jù)提供程序才支持TableDirectText指示CommandType屬性的值為SQL文本命令(默認(rèn))Stringcnstr=Sever=(local);database=stu

42、dent;IntegratedSecurity=true;SqlConnectionconn=newSqlConnection(cnstr);conn.Open();SqlCommandcmd=newSqlCommand(select*fromStudent,conn);4.CommandText屬性根據(jù)CommandType屬性的不同取值,可以使用CommandText屬性獲取或設(shè)置SQL語句、數(shù)據(jù)表名(僅限于OLEDB數(shù)據(jù)庫提供程序)或存儲過程。2.3.2Command對象的常用方法同樣,在不同的數(shù)據(jù)提供者的內(nèi)部,Command對象的名稱是不同的,在SQLServerDataProvide

43、r里叫SqlCommand,而在OLEDBDataProvider里叫OleDbCommand。下面將詳細(xì)介紹Command類型對象的常用方法,包括構(gòu)造函數(shù)、執(zhí)行不帶返回結(jié)果集的SQL語句方法、執(zhí)行帶返回結(jié)果集的SQL語句方法和使用查詢結(jié)果填充DataReader對象的方法。1.構(gòu)造函數(shù)構(gòu)造函數(shù)用來構(gòu)造Command對象。對于SqlCommand類型的對象,其構(gòu)造函數(shù)說明如表2-6所示。表2-6SqlCommand類構(gòu)造函數(shù)說明函數(shù)定義參數(shù)說明函數(shù)說明SqlCommand()不帶參數(shù)創(chuàng)建SqlCommand對象SqlCommand(stringcmdText)cmdText:SQL語句字符串根

44、據(jù)SQL語句字符串,創(chuàng)建SqlCommand對象SqlCommand(stringcmdText,SqlConnectionconnection)cmdText:SQL語句字符串connection:連接到的數(shù)據(jù)源根據(jù)數(shù)據(jù)源和SQL語句,創(chuàng)建SqlCommand對象SqlCommand(stringcmdText,SqlConnectionconnection,SqlTransactiontransaction)cmdText:SQL語句字符串connection:連接到的數(shù)據(jù)源transaction:事務(wù)對象根據(jù)數(shù)據(jù)源和SQL語句和事務(wù)對象,創(chuàng)建SqlCommand對象(1)第一個構(gòu)造函數(shù)不

45、帶任何參數(shù)SqlCommandcmd=neweSqlCommand();cmd.Connection=ConnectionObject;cmd.CommandText=CommandText;上面代碼段使用默認(rèn)的構(gòu)造函數(shù)創(chuàng)建一個SqlCommand對象。然后,把已有的Connection對象ConnectionObject和命名文本CommandText分別賦給了Command對象的Connection屬性和CommandText屬性。例如,CommandText可以從數(shù)據(jù)庫檢索數(shù)據(jù)的SQLselect語句:stringCommandText=select*fromstudentInfo;除此

46、之外,許多關(guān)系型數(shù)據(jù)庫,例如SQLServer和Oracle,都支持存儲過程??梢园汛鎯^程的名稱指定為命名文本。例如,使用編寫GetAllStudent存儲過程為命名文本:stringCommandText=GetAllStudent;cmd.CommandType=CommandType.StoredProcedure;(2)第二個構(gòu)造函數(shù)可以接受一個命令文本SqlCommandcmd=neweSqlCommand(CommandText);cmd.Connection=ConnectionObject;上面的代碼實(shí)例化了一個Command對象,并使用給定命令文本對Command對象的Co

47、mmandText屬性進(jìn)行了初始化。然后,使用已有的Connection對象對Command對象的Connection屬性進(jìn)行了賦值。(3)第三個構(gòu)造函數(shù)接受一個Connection和一個命名文本SqlCommandcmd=neweSqlCommand(CommandText,ConnectionObject);注意這兩個參數(shù)的順序,第一個為string類型的命令文本,第二個為Connection對象。(4)第四個構(gòu)造函數(shù)接受三個參數(shù),第三個參數(shù)是SqlTransaction對象,這里不做討論。另外,Connection對象提供了CreateCommand方法,該方法將實(shí)例化一個Command

48、對象,并將其Connection屬性賦值為建立該Command對象的Connection對象。無論在什么情況下,當(dāng)把Connection對象賦值給Command對象的Connection屬性時(shí),并不需要Connection對象是打開的。但是,如果連接沒有打開,則在命令執(zhí)行之前必須首先打開連接。而對于OleDbCommand類型的對象,其構(gòu)造函數(shù)如2-7所示。同樣可以看出,它們和SqlCommand類的構(gòu)造函數(shù)非常相似。表2-7OleDbCommand類構(gòu)造函數(shù)說明函數(shù)定義參數(shù)說明函數(shù)說明OleDbCommand()不帶參數(shù)創(chuàng)建OleDbCommand對象OleDbCommand(stringc

49、mdText)cmdText:SQL語句字符串根據(jù)SQL語句字符串,創(chuàng)建OleDbCommand對象OleDbCommand(stringcmdText,OleDbConnectionconnection)cmdText:SQL語句字符串connection:連接到的數(shù)據(jù)源根據(jù)數(shù)據(jù)源和SQL語句,創(chuàng)建OleDbCommand對象OleDbCommand(stringcmdText,OleDbConnectionconnection,OleDbTransactiontransaction)cmdText:SQL語句字符串connection:連接到的數(shù)據(jù)源transaction:事務(wù)對象根據(jù)數(shù)據(jù)

50、源和SQL語句和事務(wù)對象,創(chuàng)建OleDbCommand對象命令對象構(gòu)造完成后,就可以執(zhí)行命令對數(shù)據(jù)庫進(jìn)行操作了。命令對象所提供的用于執(zhí)行命令的方法有很多種,具體使用哪個方法取決于命令的執(zhí)行結(jié)果返回什么樣的數(shù)據(jù)。SqlCommand提供了4個執(zhí)行方法:ExecuteNonQuery()、ExecuteScalar()、ExecuteReader()、ExecuteXmlReader()。詳細(xì)見下面相關(guān)部分。命令對象提供的用于執(zhí)行命令的方法及其含義如表方法含義Cancel試圖取消命令的執(zhí)行ExecuteNonQuery對連接執(zhí)行SQL語句并返回受影響的行數(shù)ExecuteReader執(zhí)行查詢,將查詢

51、結(jié)果返回到數(shù)據(jù)讀取器(DataReader)中ExecuteScalar執(zhí)行查詢,并返回查詢所返回的結(jié)果集中第一行的第一列。忽略額外的列或行ExecuteXmlReader執(zhí)行查詢,將查詢結(jié)果返回到一個XmlReader對象中2.ExecuteNonQUery方法ExecuteNonQuery方法用來執(zhí)行Insert、Update、Delete等非查詢語句和其他沒有返回結(jié)果集的SQL語句,并返回執(zhí)行命令后影響的行數(shù)。如果Update和Delete命令所對應(yīng)的目標(biāo)記錄不存在,返回0。如果出錯,返回-1。Stringcnstr=server=(local);database=student;Int

52、egratedSecurity=true;SqlConnectioncn=newSqlConnection(cnstr);cn.Open();stringsqlstr=updatestudentsetname=Jonewherename=Bill;SqlCommandcmd=newSqlCommand(sqlstr,cn);cmd.ExecuteNonQuery();cn.Close();ExecuteNonQuery()方法的返回值是一個整數(shù),代表操作所影響到的行數(shù)。3.ExecuteScalar()方法在許多情況下,需要從SQL語句返回一個結(jié)果,例如客戶表中記錄的個數(shù),當(dāng)前數(shù)據(jù)庫服務(wù)器的時(shí)

53、間等。ExecuteScalar()方法就適用于這種情況。ExecuteScalar方法執(zhí)行一個SQL命令,并返回結(jié)果集中的首行首列(執(zhí)行返回單個值的命令)。如果結(jié)果集大于一行一列,則忽略其他部分。根據(jù)該特性,這個方法通常用來執(zhí)行包含Count、Sum等聚合函數(shù)的SQL語句。下面的代碼讀取數(shù)據(jù)庫中表student的記錄個數(shù),并把它輸出到控制臺上。Stringcnstr=server=(local);database=student;IntegratedSecurity=true;SqlConnectioncn=newSqlConnection(cnstr);cn.Open();stringsq

54、lstr=selectcount(*)fromstudent;SqlCommandcmd=newSqlCommand(sqlstr,cn);objectcount=cmd.ExecuteScalar();Console.WriteLine(count.ToString();cn.Close();ExecuteScalar()方法的返回值類型是Object,根據(jù)具體需要,可以將它轉(zhuǎn)換為合適的類型。4.ExecuteReader()方法ExecuteReader()方法執(zhí)行命令,并使用結(jié)果集填充DataReader對象。ExecuteReader()方法用于執(zhí)行查詢操作,它返回一個DataRead

55、er對象,通過該對象可以讀取查詢所得的數(shù)據(jù)。ExecuteReader()方法在Command對象中用得比較多,通過DataReader類型的對象,應(yīng)用程序能夠獲得執(zhí)行SQL查詢語句后的結(jié)果集。該方法的兩種定義為:ExecuteReader(),不帶參數(shù),直接返回一個DataReader結(jié)果集。ExecuteReader(CommandBehaviorbehavior),根據(jù)behavior的取值類型,決定DataReader的類型。如果behavior取值是CommandBehavior.SingleRow這個枚舉值,則說明返回的ExecuteReader只獲得結(jié)果集中的第一條數(shù)據(jù)。如果取值

56、是CommandBehavior.SingleResult,則說明只返回在查詢結(jié)果中多個結(jié)果集里的第一個。一般來說,應(yīng)用代碼可以隨機(jī)訪問返回的ExecuteReader列,但如果behavior取值為CommandBehavior.SequentialAccess,則說明對于返回的ExecuteReader對象只能順序讀取它包含的列。也就是說,一旦讀過該對象中的列,就再也不能返回去閱讀了。這種操作是以方便性為代碼換取讀數(shù)據(jù)時(shí)的高效率,需謹(jǐn)慎使用。Stringcnstr=server=(local);database=student;IntegratedSecurity=true;SqlConn

57、ectioncn=newSqlConnection(cnstr);cn.Open();stringsqlstr=select*fromstudent;SqlCommandcmd=newSqlCommand(sqlstr,cn);SqlDataReaderdr=cmd.ExecuteReader();while(dr.Read()Stringname=dr姓名.ToString();Console.WriteLine(name);dr.Close();cn.Close();這段代碼從數(shù)據(jù)庫的student表中讀取全部數(shù)據(jù),并把該表的“姓名”字段的數(shù)據(jù)全部輸出到控制臺上。ExecuteXmlRea

58、derSqlCommand特有的方法,OleDbCommand無此方法。該方法執(zhí)行將返回XML字符串的命令。它將返回一個包含所返回的XML的System.Xml.XmlReader對象。2.3.3Command對象創(chuàng)建SQl語句代碼示例在下面這段代碼里,首先根據(jù)連接字符串創(chuàng)建一個SqlConnecdon連接對象,并用此對象連接數(shù)據(jù)源:然后創(chuàng)建一個SqlCommand對象,并用此對象的ExecuteNonQuery方法執(zhí)行不帶返回結(jié)果集的SQL語句。/連接字符串privatestaticstringstrConnect=datasource=localhost;uid=sa;pwd=aspent

59、;database=LOGINDB/根據(jù)連接字符串創(chuàng)建SqlConnection連接句柄SqlConnetionobjConnection=newSqlConnection(strConnect);/數(shù)據(jù)庫命令SqlCommandobjCommand=newSqlCommand(,objConnection);/設(shè)置sql語句objCommand.CommandText=INSERTINTOUSERS+(USERNAME,NICKNAME,USERPASSWORD,USEREMAIL,USERROLE,CREATDATE,LASTMODIFYDATE)+VALUES+(USERNAME,NIC

60、KNAME,USERPASSWORD,USEREMAIL,USERROLE,CREATDATE,LASTMODIFYDATE);/以下省略設(shè)置各值的語句try/打開數(shù)據(jù)庫連接if(objConnection.State=ConnectionState.Closed)objConnection.Open();/獲取運(yùn)行結(jié)果,插入數(shù)據(jù)objCommand.ExecuteNonQuery();/省略后繼動作catch(SqlExceptione)Response.Write(e.Message.ToString();finally/關(guān)閉數(shù)據(jù)庫連接if(objConnection.State=Conn

溫馨提示

  • 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

提交評論