《C#程序設(shè)計(jì)基礎(chǔ)教程》課件第8章_第1頁(yè)
《C#程序設(shè)計(jì)基礎(chǔ)教程》課件第8章_第2頁(yè)
《C#程序設(shè)計(jì)基礎(chǔ)教程》課件第8章_第3頁(yè)
《C#程序設(shè)計(jì)基礎(chǔ)教程》課件第8章_第4頁(yè)
《C#程序設(shè)計(jì)基礎(chǔ)教程》課件第8章_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章ADO.NET(一)8.1案例介紹8.2ADO.NET8.3Connection8.4異常處理8.5using語(yǔ)句

8.1案例介紹

8.1.1數(shù)據(jù)庫(kù)設(shè)計(jì)新版音像店管理程序的數(shù)據(jù)庫(kù)名稱(chēng)是MyFilm,包括電影類(lèi)型表(FilmType)、電影信息表(Film)、用戶(hù)類(lèi)型表(UserType)、用戶(hù)信息表(User)、訂單表(Order)和訂單明細(xì)表(OrderDetails)?6張數(shù)據(jù)表,表8-1~表8-6列出了它們的詳細(xì)信息。8.1.2業(yè)務(wù)說(shuō)明用戶(hù)在使用音像店管理程序的時(shí)候,首先需要注冊(cè)一個(gè)賬號(hào),注冊(cè)賬號(hào)需要提供個(gè)人信息,并且設(shè)置個(gè)人的用戶(hù)名和密碼。有了賬號(hào)后就可以登錄系統(tǒng)。進(jìn)入系統(tǒng)后用戶(hù)可以查看電影信息,根據(jù)不同的條件查詢(xún)所要的電影。選中電影后就可以下單購(gòu)買(mǎi)。如果是管理員,除了可以查看電影和購(gòu)買(mǎi)電影外,還可以添加、編輯和刪除電影信息,管理電影分類(lèi)信息和用戶(hù)信息,并且可以審查和確認(rèn)訂單。

8.2ADO.NET

8.2.1ADO.NET簡(jiǎn)述ADO.NET是由ADO(ActiveXDataObjectActiveX,數(shù)據(jù)對(duì)象)技術(shù)發(fā)展而來(lái)的。ADO推出后順利地取代了其他的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)技術(shù),成為在WindowsNT4.0和Windows2000操作系統(tǒng)上開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序的首選。它將對(duì)象模型進(jìn)行了統(tǒng)一,而數(shù)據(jù)提供者則改由數(shù)據(jù)庫(kù)廠(chǎng)商發(fā)展,這樣ADO本身就與數(shù)據(jù)源無(wú)關(guān),這種開(kāi)發(fā)方法讓它迅速地獲得了使用ASP與VisualBasic開(kāi)發(fā)人員的青睞。然而ADO本身的架構(gòu)仍然有缺陷,這些缺陷在隨后互聯(lián)網(wǎng)應(yīng)用程序大量出現(xiàn)后表現(xiàn)得尤為突出。在2000年Microsoft.NET計(jì)劃開(kāi)始成形時(shí),這個(gè)新的架構(gòu)被改名為ADO.NET,并包裝到.NETFramework類(lèi)庫(kù)中,成為.NET平臺(tái)中唯一的數(shù)據(jù)訪(fǎng)問(wèn)組件。ADO.NET提供了對(duì)各種公開(kāi)數(shù)據(jù)源的一致訪(fǎng)問(wèn),這些數(shù)據(jù)源可以是SQLServer或其他類(lèi)型的數(shù)據(jù)庫(kù),也可以是像XML這樣的數(shù)據(jù)源,甚至是通過(guò)OLEDB和ODBC公開(kāi)的數(shù)據(jù)源。共享數(shù)據(jù)的使用方應(yīng)用程序可以使用ADO.NET連接到這些數(shù)據(jù)源,并可以檢索、處理和更新其中包含的數(shù)據(jù)。ADO.NET通過(guò)數(shù)據(jù)處理將數(shù)據(jù)訪(fǎng)問(wèn)分解為多個(gè)可以單獨(dú)使用或一前一后使用的不連續(xù)組件。ADO.NET包含用于連接到數(shù)據(jù)庫(kù)、執(zhí)行命令和檢索結(jié)果的.NETFramework數(shù)據(jù)提供程序。這些結(jié)果或者被直接處理,放在A(yíng)DO.NET數(shù)據(jù)集(DataSet)對(duì)象中以便以特別的方式向用戶(hù)公開(kāi),并與來(lái)自多個(gè)源的數(shù)據(jù)組合,或者在層之間傳遞。DataSet對(duì)象也可以獨(dú)立于.NETFramework數(shù)據(jù)提供程序,用于管理應(yīng)用程序本地的數(shù)據(jù)或源自XML的數(shù)據(jù)。8.2.2組成ADO.NET由.NET框架數(shù)據(jù)提供程序(.NETFrameworkDataProvider)和數(shù)據(jù)集(DataSet)兩個(gè)部分構(gòu)成,這兩個(gè)部分是相輔相成的,共同構(gòu)成了整個(gè)ADO.NET架構(gòu),如圖8-1所示。1..NET框架數(shù)據(jù)提供程序.NETFramework數(shù)據(jù)提供程序用于連接到數(shù)據(jù)庫(kù)、執(zhí)行命令和檢索結(jié)果。.NETFramework數(shù)據(jù)提供程序是輕量的,它在數(shù)據(jù)源和代碼之間創(chuàng)建最小的分層,并在不降低功能性的情況下提高性能。默認(rèn)情況下,ADO.NET為我們提供了四種不同的數(shù)據(jù)提供程序,如表8-7所示。如果需要使用其他類(lèi)型的數(shù)據(jù)庫(kù),就需要到相應(yīng)數(shù)據(jù)庫(kù)提供商的官方網(wǎng)站上獲取其.NET提供程序。例如,要使用Oracle數(shù)據(jù)庫(kù),可以訪(fǎng)問(wèn)站點(diǎn),從其上獲取.NET提供程序ODP.NET。每一種數(shù)據(jù)提供程序中都提供可以幫助我們完成具體數(shù)據(jù)操作的核心對(duì)象,如表8-8所示。2.?dāng)?shù)據(jù)集數(shù)據(jù)集(DataSet)是ADO.NET結(jié)構(gòu)的主要組件,它是從數(shù)據(jù)源中檢索到的數(shù)據(jù)存放在內(nèi)存中的緩存,它對(duì)于支持ADO.NET中的斷開(kāi)連接的分布式數(shù)據(jù)方案可起到至關(guān)重要的作用。DataSet是數(shù)據(jù)駐留在內(nèi)存中的表示形式,不管數(shù)據(jù)源是什么,它都可提供一致的關(guān)系編程模型。它可以用于多種不同的數(shù)據(jù)源,用于XML數(shù)據(jù),或用于管理應(yīng)用程序本地的數(shù)據(jù)。DataSet表示包括相關(guān)表、約束和表間關(guān)系在內(nèi)的整個(gè)數(shù)據(jù)集。DataSet所用到的類(lèi)主要包含在System.Data和System.Data.Common這兩個(gè)名稱(chēng)空間中,其名稱(chēng)和說(shuō)明如表8-9所示。

8.3Connection

連接對(duì)象(Connection)的作用是建立和數(shù)據(jù)庫(kù)的連接,在A(yíng)DO.NET中,一切操作皆以連接為基礎(chǔ),就像我們打電話(huà)之前要先撥號(hào)一樣。如果是SQLServer數(shù)據(jù)庫(kù),則可以使用SqlConnection類(lèi);如果是其他類(lèi)型的數(shù)據(jù)庫(kù),則可以采用OldDbConnection類(lèi),或者采用其他專(zhuān)用連接類(lèi)。但是,無(wú)論采用哪種類(lèi),連接對(duì)象都是通過(guò)一個(gè)字符串來(lái)建立與服務(wù)器的連接的。8.3.1連接數(shù)據(jù)庫(kù)SqlConnection類(lèi)位于System.Data.SqlClient名稱(chēng)空間下,因此在使用它之前首先需要在程序中引入該名稱(chēng)空間:usingSystem.Data.SqlClient;接下來(lái)我們就可以創(chuàng)建SqlConnection類(lèi)的對(duì)象了:SqlConnectionsqlConn=newSqlConnection();或SqlConnectionsqlConn=newSqlConnection(stringconStr);兩種方法都可以創(chuàng)建連接對(duì)象,但是稍微有點(diǎn)區(qū)別。第一種方法只是創(chuàng)建一個(gè)連接對(duì)象,但是沒(méi)有提供連接字符串,因此需要在后續(xù)程序中提供該字符串后才能夠使用。第二種方法在創(chuàng)建對(duì)象的時(shí)候就已經(jīng)將連接字符串作為參數(shù)傳遞給了該對(duì)象,因此可以直接使用。連接字符串是Connection對(duì)象的核心,通過(guò)這個(gè)字符串連接對(duì)象完成和數(shù)據(jù)庫(kù)的連接工作。在連接字符串中,我們需要說(shuō)明所要連接的服務(wù)器名稱(chēng)或地址、所要連接的數(shù)據(jù)庫(kù)名稱(chēng)以及連接方式等信息。例如,我們要連接音像店管理程序所用到的數(shù)據(jù)庫(kù),就可以這樣寫(xiě):stringconStr="server=.;database=MyFilm;uid=sa;pwd=12345;";在上面的代碼中我們創(chuàng)建了一個(gè)連接本地服務(wù)器上名為MyFilm數(shù)據(jù)庫(kù)的連接字符串,我們可以看到,連接字符串由被分號(hào)隔開(kāi)的四個(gè)部分組成,其作用如下:(1)?server:表示要連接到的數(shù)據(jù)庫(kù)服務(wù)器。這里我們連接的是本地服務(wù)器的默認(rèn)實(shí)例。如果要連接遠(yuǎn)程服務(wù)器,則需要指明服務(wù)器名稱(chēng)或IP地址。另外,SQLServer允許在同一臺(tái)計(jì)算機(jī)上運(yùn)行多個(gè)不同的數(shù)據(jù)庫(kù)服務(wù)器實(shí)例,如果連接的不是默認(rèn)實(shí)例,則需要指明實(shí)例名稱(chēng),例如server=dataSer/Test。除了使用server外,我們還可以使用datasource來(lái)指定服務(wù)器,效果和使用方式與server一樣。(2)?database:標(biāo)識(shí)要連接到的數(shù)據(jù)庫(kù)名稱(chēng)。每一個(gè)SQLServer服務(wù)器上都可以存在多個(gè)數(shù)據(jù)庫(kù)實(shí)例,因此需要指明連接到哪個(gè)數(shù)據(jù)庫(kù)上,這里我們連接的是MyFilm這個(gè)數(shù)據(jù)庫(kù)。和database具有相同作用的是initialcatalog。例如,initialcatalog=MyFilm。(3)?uid:當(dāng)我們采用SQLServer身份驗(yàn)證方式登錄服務(wù)器時(shí),就需要通過(guò)uid提供登錄的用戶(hù)名,該用戶(hù)名必須是數(shù)據(jù)庫(kù)服務(wù)器中存在并可以正常登錄的,這里我們用的是sa這個(gè)用戶(hù)名。和uid具有相同效果的是userid。(4)?pwd:當(dāng)我們采用SQLServer身份驗(yàn)證方式登錄服務(wù)器時(shí),就需要通過(guò)pwd提供登錄的密碼,這里我們的密碼是123456,當(dāng)然實(shí)際開(kāi)發(fā)的時(shí)候是不能夠這樣寫(xiě)的。和pwd具有相同效果的是password。例如,password=123456。除了采用SQLServer身份驗(yàn)證方式登錄服務(wù)器外,還可以采用Windows身份驗(yàn)證方式登錄服務(wù)器,其連接字符串是:stringconStr="datasource=.;initialcatalog=MyFilm;integratedsecurity=SSPI;";在這個(gè)連接字符串中,原來(lái)的uid和pwd已經(jīng)被去掉了,取而代之的是integratedsecurity,其值可以是SSPI或者true,作用就是采用Windows身份驗(yàn)證方式連接到數(shù)據(jù)庫(kù)。除了手寫(xiě)連接字符串外,我們還可以通過(guò)工具自動(dòng)生成,其過(guò)程如下:(1)在VS2010中,選擇菜單中的“視圖(V)”→“服務(wù)器資源管理器(V)”菜單項(xiàng)(快捷鍵為“Ctrl+Alt+S”),打開(kāi)服務(wù)器資源管理器,如圖8-2所示。(2)在打開(kāi)的服務(wù)器資源管理器中,鼠標(biāo)右鍵單擊“數(shù)據(jù)連接”,在彈出的菜單中選擇“添加連接(A)...”菜單項(xiàng)。(3)在打開(kāi)的“選擇數(shù)據(jù)源”窗體的左側(cè),我們可以看到一個(gè)數(shù)據(jù)源列表,列出了系統(tǒng)提供的數(shù)據(jù)源,我們選擇使用“MicrosoftSQLServer”數(shù)據(jù)源。在列表下方的下拉列表中選擇相應(yīng)的數(shù)據(jù)提供程序,這里我們選擇“用于SQLServer的.NETFramework數(shù)據(jù)提供程序”,然后點(diǎn)擊“確定”按鈕,如圖8-4所示。如果要了解其他信息,則在“數(shù)據(jù)源(S):”列表中選中一個(gè)數(shù)據(jù)源,就可以在它的右側(cè)看到關(guān)于該數(shù)據(jù)源的說(shuō)明信息。(4)在打開(kāi)的添加連接窗體中,處于最上方的是“數(shù)據(jù)源(S):”,這里顯示的就是我們剛才所選擇的內(nèi)容,如果需要更改可以點(diǎn)擊“更改(C)...”按鈕返回到上一步進(jìn)行更改。在其下方是“服務(wù)器名(E):”,可以手動(dòng)輸入服務(wù)器名稱(chēng)或者通過(guò)下拉列表選擇,這里我們連接的是本地服務(wù)器,因此輸入“.”即可。如果需要連接的服務(wù)器沒(méi)有出現(xiàn)在下拉列表中,那么可以點(diǎn)擊“刷新(R)”按鈕刷新下拉列表。再往下就是登錄服務(wù)器的方式,可以選擇“使用Windows身份驗(yàn)證(W)”或“使用SQLServer身份驗(yàn)證(Q)”。如果選擇前者,那么就是用當(dāng)前登錄到Windows的用戶(hù)信息登錄數(shù)據(jù)庫(kù)服務(wù)器;如果選擇后者,則下方的“用戶(hù)名(U):”和“密碼(P):”文本框?qū)⒈患せ?,供我們輸入登錄的用?hù)名和密碼。這里我們選擇采用Windows身份驗(yàn)證方式登錄。接下來(lái)進(jìn)入到“選擇一個(gè)數(shù)據(jù)庫(kù)”環(huán)節(jié),在這里我們可以通過(guò)“選擇或輸入一個(gè)數(shù)據(jù)庫(kù)名(D):”這個(gè)下拉列表輸入或者選擇服務(wù)器上已經(jīng)存在的一個(gè)數(shù)據(jù)庫(kù),這里我們選擇“MyFilm”數(shù)據(jù)庫(kù)。如果我們的數(shù)據(jù)庫(kù)并不在當(dāng)前服務(wù)器上,而是以數(shù)據(jù)庫(kù)文件的方式存放在磁盤(pán)中,我們可以選擇“附加一個(gè)數(shù)據(jù)庫(kù)文件(H):”,這時(shí)其下方的兩個(gè)文本框?qū)?huì)被激活,在上面的文本框中我們可以輸入主數(shù)據(jù)庫(kù)文件的路徑和文件名,或者點(diǎn)擊“瀏覽(B)...”按鈕選擇。下方文本框則可以輸入附加數(shù)據(jù)庫(kù)的邏輯名稱(chēng)。所有內(nèi)容都設(shè)置完畢后可以點(diǎn)擊“測(cè)試鏈接(T)”按鈕測(cè)試是否可以正常連接到服務(wù)器,如果不能夠正常連接則需要返回重新設(shè)置連接信息;如果測(cè)試通過(guò),就可以點(diǎn)擊“確定”按鈕完成添加,如圖8-5所示。(5)回到服務(wù)器資源管理器窗體,在其中可以看到我們新添加的連接,展看后可以看到其所包含的內(nèi)容,如圖8-6所示。(6)右鍵單擊該連接,在彈出的菜單中選擇“屬性(R)”菜單項(xiàng)后打開(kāi)該連接屬性窗體,在該窗體中我們可以看到有一個(gè)“連接字符串”的屬性,這就是系統(tǒng)根據(jù)我們的選擇自動(dòng)生成的連接字符串,雙擊后復(fù)制就可以使用了。連接對(duì)象創(chuàng)建完畢后,就可以通過(guò)其屬性和方法來(lái)完成各種操作,表8-10中列出了Connection類(lèi)常用的屬性。除了屬性外,連接對(duì)象還提供了很多方法,表8-11列出了其常用的方法及其說(shuō)明。這些方法中最常用的是Open()和Close()。Open()方法類(lèi)似于手機(jī)的呼叫按鈕,輸入號(hào)碼后要按下呼叫按鈕才能夠撥出電話(huà)。連接對(duì)象也是一樣,設(shè)置了連接字符串后調(diào)用Open()方法才開(kāi)始真正地和數(shù)據(jù)庫(kù)建立連接。當(dāng)連接使用完畢后一定不要忘記了調(diào)用Close()方法來(lái)關(guān)閉連接,因?yàn)檫B接是“稀缺”的資源,所以最好確保每個(gè)資源使用完畢后立即關(guān)閉。stringconStr="datasource=.;initialcatalog=MyFilm;integratedsecurity=SSPI;";SqlConnectionconn=newSqlConnection(conStr);//SqlConnectionconn=newSqlConnection();//conn.ConnectionString=conStr;conn.Open();MessageBox.Show("連接成功!","連接數(shù)據(jù)庫(kù)");conn.Close();在上面的代碼中,我們首先將數(shù)據(jù)庫(kù)連接字符串放置在一個(gè)字符串變量中,接下來(lái)聲明數(shù)據(jù)庫(kù)連接對(duì)象時(shí)將這個(gè)字符串類(lèi)型的變量作為參數(shù)傳遞給連接對(duì)象的構(gòu)造,也可以采用下面注釋起來(lái)的方式先聲明連接對(duì)象,然后通過(guò)其ConnectionString屬性來(lái)設(shè)置連接字符串。無(wú)論采用哪種方式創(chuàng)建的數(shù)據(jù)庫(kù)連接對(duì)象都需要調(diào)用Open()方法來(lái)打開(kāi)連接,并且調(diào)用Close()方法關(guān)閉連接。8.3.2配置文件能夠正確連接數(shù)據(jù)庫(kù)只是完整使用Connection對(duì)象的第一步,事實(shí)上只要仔細(xì)觀(guān)察上面我們所寫(xiě)的代碼就會(huì)發(fā)現(xiàn)問(wèn)題:如果服務(wù)器或者數(shù)據(jù)庫(kù)發(fā)生了變化怎么辦?因?yàn)镃onnection對(duì)象和服務(wù)器連接的基礎(chǔ)就是連接字符串,而在這個(gè)字符串中我們需要指出服務(wù)器的名稱(chēng)或者地址,還要說(shuō)明數(shù)據(jù)庫(kù)的名稱(chēng)等信息,很顯然如果服務(wù)器或者數(shù)據(jù)庫(kù)發(fā)生了變化,那么連接字符串一定也要做出相應(yīng)的改變,也就是說(shuō)我們的代碼需要跟著變化,這會(huì)導(dǎo)致一系列重復(fù)的工作:重新測(cè)試、重新編譯、重新發(fā)布等,很顯然這樣會(huì)讓我們的開(kāi)發(fā)和維護(hù)成本大大增加。如何解決這個(gè)問(wèn)題呢?方法其實(shí)并不復(fù)雜,通過(guò)剛才的分析我們其實(shí)已經(jīng)找到了問(wèn)題的根結(jié),即連接字符串。事實(shí)上,在上面我們所寫(xiě)的代碼中唯一會(huì)發(fā)生變化的就是這個(gè)字符串,那么如果我們將其從我們的程序中“拿走”,那我們的程序就變得和這個(gè)字符串無(wú)關(guān)了。再將被“隔離”出來(lái)的字符串放置到一個(gè)容易被編輯的地方,然后通過(guò)其他方式將其讀取到程序中,這樣無(wú)論連接字符串怎么變化我們的程序都不需要再改變了??吹竭@里實(shí)際上解決問(wèn)題的思路已經(jīng)有了,我們可以將連接字符串放置到一個(gè)文本文件中,然后通過(guò)文件讀取類(lèi)StreamReader將它讀取到程序中來(lái)使用。這樣用戶(hù)即可方便地編輯字符串,我們的程序也可以在不發(fā)生變化的情況下繼續(xù)使用。讀取文本文件的方式我們已經(jīng)在前面的章節(jié)中學(xué)習(xí)過(guò)了,因此這里介紹另外一種處理方式。配置文件。在.NET中,配置文件是一種預(yù)先定義好的可以按需要更改的XML(ExtensibleMarkupLanguage,可擴(kuò)展標(biāo)記語(yǔ)言)文件。開(kāi)發(fā)人員可以使用配置文件來(lái)更改設(shè)置,而不必重編譯應(yīng)用程序。管理員可以使用配置文件來(lái)設(shè)置策略,以便影響應(yīng)用程序在計(jì)算機(jī)上運(yùn)行的方式。在WinForm中微軟已經(jīng)為我們預(yù)定義了一個(gè)配置文件,即應(yīng)用程序配置文件,添加的過(guò)程很簡(jiǎn)單,首先在項(xiàng)目上右鍵單擊,在彈出的菜單中選擇“添加(D)”→“新建項(xiàng)(W)…”,如圖8-9所示。在打開(kāi)的“添加新項(xiàng)”窗體中選擇“應(yīng)用程序配置文件”,如圖8-10所示。需要注意的是該文件的名稱(chēng)不能更改,只能是App.config。在程序生成的時(shí)候系統(tǒng)會(huì)自動(dòng)將其改成應(yīng)用程序的名稱(chēng),并保存在與應(yīng)用程序同一目錄下。點(diǎn)擊“添加(A)”按鈕后完成操作,這時(shí)可以在解決方案資源管理器中看到新添加的配置文件。在.NET中配置文件是一個(gè)預(yù)定義格式的XML文件,而XML本身龐大的內(nèi)容已經(jīng)遠(yuǎn)遠(yuǎn)超出了本書(shū)要討論的范圍,因此在這里我們只需要掌握如何按照要求配置和使用它就可以了,有關(guān)XML的詳細(xì)內(nèi)容我們會(huì)在后面的課程中詳細(xì)介紹。雙擊打開(kāi)App.config文件后就可以完成編輯工作:<?xmlversion="1.0"encoding="utf-8"?><configuration><appSettings><addkey="SQL"value="datasource=.;initialcatalog=MyFilm;integratedsecurity=SSPI;"/></appSettings><connectionStrings><addname="SQL"connectionString="datasource=.;initialcatalog=MyFilm;integratedsecurity=SSPI;"/></connectionStrings></configuration>在上面的代碼中,第一行是XML的版本聲明和編碼方式說(shuō)明,接下來(lái)是整個(gè)配置文件的根節(jié)點(diǎn)<configuration>,XML文件要求有且只有一個(gè)根節(jié)點(diǎn),其他內(nèi)容都必須包含在根節(jié)點(diǎn)中。在<configuration>節(jié)點(diǎn)內(nèi)部,我們添加了兩個(gè)配置項(xiàng),即<appSettings>和<connectionStrings>,這兩個(gè)配置項(xiàng)都可以完成數(shù)據(jù)庫(kù)連接字符串的配置工作,兩者任選其一即可,這里為了說(shuō)明的完整性才將兩個(gè)配置項(xiàng)都設(shè)置了。對(duì)于<appSettings>配置項(xiàng),我們主要使用的是其<add>子節(jié)點(diǎn),在這個(gè)節(jié)點(diǎn)中我們需要指定key和value兩個(gè)屬性。key指定該配置項(xiàng)的名稱(chēng),一個(gè)<appSettings>可以有很多個(gè)<add>子節(jié)點(diǎn),為了能夠區(qū)分這些子節(jié)點(diǎn),要求其key值必須唯一。value用來(lái)設(shè)定連接字符串。對(duì)于<connectionStrings>配置項(xiàng),我們也是使用其<add>子節(jié)點(diǎn),其name屬性和<appSettings>配置項(xiàng)的key屬性作用一樣,要求也一樣,connectionString屬性則和value屬性一樣。配置文件設(shè)置完畢后,接下來(lái)我們需要在程序中將其讀取出來(lái)。首先需要添加對(duì)System.Configuration名稱(chēng)空間的引用,該名稱(chēng)空間的作用就是提供對(duì)配置文件操作的類(lèi):usingSystem.Configuration;如果使用的是<appSettings>配置項(xiàng),就可以直接在程序中讀取使用:stringconStr=ConfigurationSettings.AppSettings["SQL"];上面代碼中我們使用了ConfigurationSettings類(lèi),其作用是讀取配置文件中的內(nèi)容,我們通過(guò)它的AppSettings屬性訪(fǎng)問(wèn)配置文件的<appSettings>配置項(xiàng)。前面我們講過(guò),<appSettings>配置項(xiàng)可以有多個(gè)<add>子節(jié)點(diǎn),因此在程序中需要指明讀取的是哪個(gè)節(jié)點(diǎn)的內(nèi)容,方式就是在中括號(hào)中寫(xiě)上key的值。在實(shí)際使用中我們發(fā)現(xiàn)上面的代碼在VS2010中會(huì)產(chǎn)生一個(gè)警告,原因是從.NET2.0之后,相關(guān)的操作已經(jīng)改為由ConfigurationManager類(lèi)來(lái)完成,上面的操作方式已經(jīng)過(guò)時(shí)了。ConfigurationManager類(lèi)提供了對(duì)客戶(hù)端應(yīng)用程序配置文件的訪(fǎng)問(wèn),使用它除了需要添加對(duì)System.Configuration名稱(chēng)空間的引用外,還需要添加對(duì)System.Configuration.dll程序集的引用,方式并不復(fù)雜,首先在我們的項(xiàng)目上右鍵單擊,在彈出的菜單中選擇“添加引用(F)…”,或者在項(xiàng)目中的“引用”文件夾上右鍵單擊,在彈出的菜單中選擇“添加引用(F)…”,如圖8-12所示。這時(shí)候就會(huì)打開(kāi)添加引用窗體,我們可以看到一個(gè)選項(xiàng)卡控件包含有“.NET”、“COM”、“項(xiàng)目”、“瀏覽”和“最近”等5個(gè)選項(xiàng)卡,這里我們選擇“.NET”選項(xiàng)卡,在其中的列表中找到“System.Configuration”,然后點(diǎn)擊“確定”按鈕。這樣我們就可以使用ConfigurationManager類(lèi)來(lái)完成對(duì)配置文件的讀取工作了://讀取<appSettings>配置項(xiàng)stringappStr=ConfigurationManager.AppSettings["SQL"];//讀取<connectionStrings>配置項(xiàng)stringconStr=ConfigurationManager.ConnectionStrings["SQL"].ConnectionString;在上面的代碼中我們可以看到,ConfigurationManager類(lèi)的使用方式和ConfigurationSettings類(lèi)的使用方式基本一樣,都是通過(guò)屬性來(lái)訪(fǎng)問(wèn)配置文件,區(qū)別在于ConfigurationManager類(lèi)能夠通過(guò)AppSettings屬性和ConnectionStrings屬性來(lái)分別訪(fǎng)問(wèn)<appSettings>配置項(xiàng)和<connectionStrings>配置項(xiàng),而ConfigurationSettings類(lèi)則只能夠通過(guò)AppSettings屬性訪(fǎng)問(wèn)<appSettings>配置項(xiàng)。有了配置文件和ConfigurationManager類(lèi)的幫助,我們就可以將連接字符串放置到配置文件中,由于配置文件是純文本的,因此用戶(hù)可以借助任何文本編輯器對(duì)它進(jìn)行修改,而我們的程序則可以做到完全和連接字符串無(wú)關(guān),這樣既保證了連接字符串的靈活性,又減少了我們的工作量。8.3.3連接池連接池是一個(gè)經(jīng)常被初學(xué)者忽略的“幕后英雄”,事實(shí)上連接到數(shù)據(jù)庫(kù)服務(wù)器通常由幾個(gè)需要很長(zhǎng)時(shí)間的步驟組成:必須建立物理通道;必須與服務(wù)器進(jìn)行初次握手;必須分析連接字符串信息;必須由服務(wù)器對(duì)連接進(jìn)行身份驗(yàn)證;必須運(yùn)行檢查以便在當(dāng)前事務(wù)中登記;等等。而在實(shí)際開(kāi)發(fā)和應(yīng)用中,應(yīng)用程序僅使用一個(gè)或幾個(gè)不同的連接配置。這意味著在執(zhí)行應(yīng)用程序期間,許多相同的連接將反復(fù)地打開(kāi)和關(guān)閉,很顯然這不但會(huì)浪費(fèi)系統(tǒng)資源,也會(huì)影響到應(yīng)用程序的執(zhí)行效率。連接池的任務(wù)就是解決這樣的問(wèn)題。在A(yíng)DO.NET中,一旦我們使用到了Connection對(duì)象,系統(tǒng)會(huì)自動(dòng)啟動(dòng)一個(gè)池進(jìn)程來(lái)管理我們的連接,這個(gè)進(jìn)程保持所有物理連接的所有權(quán),也就是說(shuō)所有的Connection對(duì)象的都?xì)w它管。池進(jìn)程通過(guò)為每個(gè)給定的連接配置保留一組活動(dòng)連接來(lái)管理連接。每當(dāng)用戶(hù)在連接上調(diào)用Open()方法時(shí),池進(jìn)程就會(huì)查找池中可用的連接。如果某個(gè)池連接可用,會(huì)將該連接返回給調(diào)用者,而不是打開(kāi)新連接。應(yīng)用程序在該連接上調(diào)用Close()方法時(shí),池進(jìn)程會(huì)將連接返回到活動(dòng)連接池集中,而不是關(guān)閉連接。連接返回到池中之后,即可在下一個(gè)Open()方法調(diào)用中重復(fù)使用。這就好像一個(gè)小飯館,每天早上開(kāi)門(mén)營(yíng)業(yè)后,服務(wù)員會(huì)將座椅板凳從庫(kù)房里拿出來(lái),擺放在外面供顧客們使用。當(dāng)一位顧客用餐完畢后服務(wù)員不會(huì)將它們放回到庫(kù)房,而是清潔桌面后供下一位顧客使用,這樣才能夠接待更多個(gè)客人。Connection對(duì)象就像是座椅板凳一樣,盡量反復(fù)使用才能夠使效率最大化。連接池可以顯著提高應(yīng)用程序的性能和可縮放性。默認(rèn)情況下,在A(yíng)DO.NET將啟用連接池。除非顯式禁用,否則,在應(yīng)用程序中打開(kāi)和關(guān)閉連接時(shí),池進(jìn)程會(huì)對(duì)連接進(jìn)行優(yōu)化。在我們初次打開(kāi)連接時(shí),系統(tǒng)將根據(jù)我們提供的連接字符串先在現(xiàn)有池中查找完全匹配項(xiàng),如果未找到則會(huì)按進(jìn)程、應(yīng)用程序域、連接字符串以及Windows標(biāo)識(shí)(在使用集成的安全性時(shí))來(lái)創(chuàng)建一個(gè)新池:SqlConnectionconnA=newSqlConnection("IntegratedSecurity=SSPI;InitialCatalog=Northwind");connA.Open();SqlConnectionconnB=newSqlConnection("IntegratedSecurity=SSPI;InitialCatalog=pubs");connB.Open();SqlConnectionconnC=newSqlConnection("IntegratedSecurity=SSPI;InitialCatalog=Northwind");connC.Open();連接池是為每個(gè)唯一的連接字符串創(chuàng)建的,因此在上面的代碼中我們創(chuàng)建了三個(gè)連接對(duì)象,但是connA和connC采用的連接字符串一樣,這樣系統(tǒng)在管理這些連接對(duì)象時(shí)就會(huì)創(chuàng)建兩個(gè)連接池。當(dāng)創(chuàng)建一個(gè)池后,將創(chuàng)建多個(gè)連接對(duì)象并將其添加到該池中,以滿(mǎn)足最小池大小的要求。連接根據(jù)需要添加到池中,但是不能超過(guò)指定的最大池大小(默認(rèn)值為100),連接在關(guān)閉或斷開(kāi)時(shí)釋放回池中。在請(qǐng)求SqlConnection對(duì)象時(shí),如果存在可用的連接,將從池中獲取該對(duì)象。連接要可用,必須未使用,具有匹配的事務(wù)上下文或未與任何事務(wù)上下文關(guān)聯(lián),并且具有與服務(wù)器的有效連接。連接池進(jìn)程通過(guò)在連接釋放回池中時(shí)重新分配連接,來(lái)滿(mǎn)足這些連接請(qǐng)求。如果已達(dá)到最大池大小且不存在可用的連接,則該請(qǐng)求將會(huì)排隊(duì)。然后,池進(jìn)程嘗試重新建立任何連接,直至到達(dá)超時(shí)時(shí)間(默認(rèn)值為15s)。如果池進(jìn)程在連接超時(shí)之前無(wú)法滿(mǎn)足請(qǐng)求,將引發(fā)異常。如果連接長(zhǎng)時(shí)間空閑,或池進(jìn)程檢測(cè)到與服務(wù)器的連接已斷開(kāi),連接池進(jìn)程會(huì)將該連接從池中移除。注意,只有在嘗試與服務(wù)器進(jìn)行通信之后才能檢測(cè)到斷開(kāi)的連接。如果發(fā)現(xiàn)某連接不再連接到服務(wù)器,則會(huì)將其標(biāo)記為無(wú)效。無(wú)效連接只有在關(guān)閉或重新建立后,才會(huì)從連接池中移除。如果存在一個(gè)與已消失的服務(wù)器的連接,即使連接池進(jìn)程尚未檢測(cè)到斷開(kāi)的連接,也可以從池中取出此連接并將連接標(biāo)記為無(wú)效。這種情況是因?yàn)闄z查連接是否仍有效的系統(tǒng)開(kāi)銷(xiāo)將造成與服務(wù)器的另一次往返,從而抵消了池進(jìn)程的優(yōu)勢(shì)。發(fā)生此情況時(shí),初次嘗試使用該連接將檢測(cè)連接是否曾斷開(kāi),并引發(fā)異常。Connection對(duì)象通過(guò)ClearAllPools()和ClearPool()兩個(gè)方法來(lái)清除池。ClearAllPools()將清除給定提供程序的連接池,而ClearPool()將清除與特定連接相關(guān)聯(lián)的連接池。如果在調(diào)用時(shí)連接正在使用,將對(duì)它們進(jìn)行相應(yīng)的標(biāo)記。連接關(guān)閉時(shí),將被丟棄,而不是返回池中。

8.4異常處理

只要程序出現(xiàn)了異常,系統(tǒng)都會(huì)產(chǎn)生并且反饋相應(yīng)的錯(cuò)誤信息,而我們所要做的就是捕獲到這些錯(cuò)誤信息,并且讓我們的程序通過(guò)一個(gè)安全的通道退出,并采取相應(yīng)的應(yīng)對(duì)措施。C#語(yǔ)言為我們提供了最佳的工具,稱(chēng)為異常處理機(jī)制。為了在C#代碼中處理可能的錯(cuò)誤情況,一般要把程序的相關(guān)部分分成三種不同類(lèi)型的代碼塊,其語(yǔ)法格式如下:try{//可能發(fā)生異常的程序代碼塊}catch(Exceptionex){//處理異常的代碼塊,若異常不被處理,則程序?qū)?huì)中止}[finally{//是否發(fā)生異常,均要執(zhí)行的代碼快}]try塊包含的代碼組成了程序的正常操作部分,但是這部分程序可能會(huì)遇到某些嚴(yán)重的錯(cuò)誤。catch塊包含的代碼處理各種錯(cuò)誤情況,這些錯(cuò)誤是執(zhí)行try塊中的代碼時(shí)遇到的。這個(gè)塊還可以用于記錄錯(cuò)誤。finally塊包含的代碼一般為清理資源或執(zhí)行通常要在try塊或catch塊末尾執(zhí)行的其他操作,例如關(guān)閉數(shù)據(jù)庫(kù)連接等。無(wú)論是否產(chǎn)生異常,都會(huì)執(zhí)行finally塊,理解這一點(diǎn)非常重要。因?yàn)閒inally塊包含了應(yīng)該總是執(zhí)行的清理代碼,如果在finally塊中放置了return語(yǔ)句,編譯器就會(huì)標(biāo)記一個(gè)錯(cuò)誤。finally塊是可選的,如果不需要可以不寫(xiě)。有了try結(jié)構(gòu),我們就可以將上面連接數(shù)據(jù)庫(kù)的代碼重新組織一下:SqlConnectionconn=newSqlConnection();try{stringconStr=ConfigurationManager.ConnectionStrings["SQL"].ConnectionString;conn.ConnectionString=conStr;conn.Open();MessageBox.Show("連接成功!","系統(tǒng)提示");}catch(Exceptionex){MessageBox.Show(ex.Message,"系統(tǒng)提示");}finally{conn.Close();}在上面的代碼中,我們首先創(chuàng)建了一個(gè)SqlConnection連接,但是

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論