连接访问数据库的技术方法
幾種數(shù)據(jù)庫(kù)連接方式優(yōu)缺點(diǎn)比較
|
訪(fǎng)問(wèn)接口 |
易用性 |
運(yùn)行能力 |
可擴(kuò)展性 |
技術(shù)層次 |
突出特點(diǎn) |
|
ODBC |
差 |
較高 |
差 |
底層 |
可進(jìn)行底層控制 |
|
MFC ODBC |
好 |
一般 |
高層 |
同用標(biāo)準(zhǔn),應(yīng)用廣泛 |
|
|
MFC DAO |
好 |
較高 |
一般 |
高層 |
訪(fǎng)問(wèn)JET性能最好 |
|
OLE DB |
很難 |
高 |
好 |
底層 |
可訪(fǎng)問(wèn)非關(guān)系型數(shù)據(jù)庫(kù) |
|
ADO |
最好 |
高 |
好 |
高層 |
可訪(fǎng)問(wèn)非關(guān)系型數(shù)據(jù)庫(kù),有多種編程接口 |
ODBC是一種底層的訪(fǎng)問(wèn)技術(shù),因此,ODBC API可以是客戶(hù)應(yīng)用程序能從底層設(shè)置和控制數(shù)據(jù)庫(kù),完成一些高級(jí)數(shù)據(jù)庫(kù)技術(shù)無(wú)法完成的功能;但不足之處由于ODBC只能用于關(guān)系型數(shù)據(jù)庫(kù),使得利用ODBC很難訪(fǎng)問(wèn)對(duì)象數(shù)據(jù)庫(kù)及其他非關(guān)系數(shù)據(jù)庫(kù)。
DAO提供了一種通過(guò)程序代碼創(chuàng)建和操縱數(shù)據(jù)庫(kù)的機(jī)制。最大特點(diǎn)是對(duì)MICROSOFT JET數(shù)據(jù)庫(kù)的操作很方便,而且是操作JET數(shù)據(jù)庫(kù)時(shí)性能最好的技術(shù)接口之一。并且它并不只能用于訪(fǎng)問(wèn)這種數(shù)據(jù)庫(kù),事實(shí)上,通過(guò)DAO技術(shù)可以訪(fǎng)問(wèn)從文本文件到大型后臺(tái)數(shù)據(jù)庫(kù)等多種數(shù)據(jù)格式。
ADO是基于OLE DB的訪(fǎng)問(wèn)接口,它是面向?qū)ο蟮腛LE DB技術(shù),繼承了OLE DB的優(yōu)點(diǎn)。屬于數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的高層接口。
在速度上ADO〉DAO〉ODBC,綜合評(píng)定ADO,ODBC,DAO
ODBC是Microsoft的基于關(guān)系數(shù)據(jù)庫(kù)一種互連技術(shù),它只能訪(fǎng)問(wèn)關(guān)系數(shù)據(jù)庫(kù),如果使用SQLAPI進(jìn)行編程,效率較好,但代碼較多,如果使用MFC ODBC封裝的類(lèi)進(jìn)行訪(fǎng)問(wèn)比較簡(jiǎn)單。
ADO是一種基于COM的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)技術(shù),可以訪(fǎng)問(wèn)關(guān)系數(shù)據(jù)庫(kù)與非關(guān)系數(shù)據(jù)庫(kù),由于它是基于COM的,訪(fǎng)問(wèn)速度也較快,占用資源較小。
DAO是Microsoft一種用來(lái)訪(fǎng)問(wèn)Jet引擎的方法,主要用來(lái)訪(fǎng)問(wèn)Access數(shù)據(jù)庫(kù),使用起來(lái)比較簡(jiǎn)單。
1.3.1 數(shù)據(jù)庫(kù)的連接方式
1. ODBC數(shù)據(jù)庫(kù)接口
ODBC即開(kāi)放式數(shù)據(jù)庫(kù)互連(Open Database Connectivity),是微軟公司推出的一種實(shí)現(xiàn)應(yīng)用程序和關(guān)系數(shù)據(jù)庫(kù)之間通訊的接口標(biāo)準(zhǔn)。符合標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)就可以通過(guò)SQL語(yǔ)言編寫(xiě)的命令對(duì)數(shù)據(jù) 庫(kù)進(jìn)行操作,但只針對(duì)關(guān)系數(shù)據(jù)庫(kù)。目前所有的關(guān)系數(shù)據(jù)庫(kù)都符合該標(biāo)準(zhǔn)(如SQL Server,Oracle,Access,Excel等)。ODBC本質(zhì)上是一組數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)API(應(yīng)用程序編程接口),由一組函數(shù)調(diào)用組成,核心是SQL語(yǔ)句,其結(jié)構(gòu)如圖1.8所示:
圖 1.8 ODBC數(shù)據(jù)庫(kù)接口
2. OLE DB數(shù)據(jù)庫(kù)接口
OLE DB即數(shù)據(jù)庫(kù)鏈接和嵌入對(duì)象(Object Linking and Embedding DataBase)。OLE DB是微軟提出的基于COM思想且面向?qū)ο蟮囊环N技術(shù)標(biāo)準(zhǔn),目的是提供一種統(tǒng)一的數(shù)據(jù)訪(fǎng)問(wèn)接口訪(fǎng)問(wèn)各種數(shù)據(jù)源,這里所說(shuō)的“數(shù)據(jù)”除了標(biāo)準(zhǔn)的關(guān)系型數(shù)據(jù)庫(kù) 中的數(shù)據(jù)之外,還包括郵件數(shù)據(jù)、Web上的文本或圖形、目錄服務(wù)(DirectoryServices)、以及主機(jī)系統(tǒng)中的文件和地理數(shù)據(jù)以及自定義業(yè)務(wù) 對(duì)象等。OLE DB標(biāo)準(zhǔn)的核心內(nèi)容就是提供一種相同的訪(fǎng)問(wèn)接口,使得數(shù)據(jù)的使用者(應(yīng)用程序)可以使用同樣的方法訪(fǎng)問(wèn)各種數(shù)據(jù),而不用考慮數(shù)據(jù)的具體存儲(chǔ)地點(diǎn)、格式或類(lèi)型,其結(jié)構(gòu)圖如圖1.9所示:
圖1.9 OLE DB數(shù)據(jù)庫(kù)接口
3. ADO數(shù)據(jù)庫(kù)接口
ADO(ActiveX Data Objects)是微軟公司開(kāi)發(fā)的基于COM的數(shù)據(jù)庫(kù)應(yīng)用程序接口,通過(guò)ADO連接數(shù)據(jù)庫(kù),可以靈活地操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)。
圖1.10展示了應(yīng)用程序通過(guò)ADO訪(fǎng)問(wèn)SQL Server數(shù)據(jù)庫(kù)接口。從圖中可看出,使用ADO訪(fǎng)問(wèn)SQL Server數(shù)據(jù)庫(kù)有兩種途徑:一種是通過(guò)ODBC驅(qū)動(dòng)程序,另一種是通過(guò)SQL Server專(zhuān)用的OLE DBProvider,后者有更高的訪(fǎng)問(wèn)效率。
圖1.10 ADO訪(fǎng)問(wèn)SQLServer的接口
4. ADO.NET數(shù)據(jù)庫(kù)接口
ASP.Net 使用 ADO.NET 數(shù)據(jù)模型。該模型從ADO 發(fā)展而來(lái),但它不只是對(duì) ADO的改進(jìn),而是采用了一種全新的技術(shù)。主要表現(xiàn)在以下幾個(gè)方面:
● ADO.NET 不是采用ActiveX 技術(shù),而是與.NET框架緊密結(jié)合的產(chǎn)物。
● ADO.NET 包含對(duì) XML標(biāo)準(zhǔn)的完全支持,這對(duì)于跨平臺(tái)交換數(shù)據(jù)具有重要的意義。
● ADO.NET 既能在與數(shù)據(jù)源連接的環(huán)境下工作,又能在斷開(kāi)與數(shù)據(jù)源連接的條件下工作。特別是后者,非常適合于網(wǎng)絡(luò)應(yīng)用的需要。因?yàn)樵诰W(wǎng)絡(luò)環(huán)境下,保持與數(shù)據(jù)源連接,不符合網(wǎng)站的要求,不僅效率低,付出的代價(jià)高,而且常常會(huì)引發(fā)由于多個(gè)用戶(hù)同時(shí)訪(fǎng)問(wèn)時(shí)帶來(lái)的沖突。因此 ADO.NET 系統(tǒng)集中主要精力用于解決在斷開(kāi)與數(shù)據(jù)源連接的條件下數(shù)據(jù)處理的問(wèn)題。
ADO.NET 提供了面向?qū)ο蟮臄?shù)據(jù)庫(kù)視圖,并且在 ADO.NET 對(duì)象中封裝了許多數(shù)據(jù)庫(kù)屬性和關(guān)系。最重要的是,ADO.NET 通過(guò)很多方式封裝和隱藏了很多數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的細(xì)節(jié)??梢酝耆恢缹?duì)象在與 ADO.NET 對(duì)象交互,也不用擔(dān)心數(shù)據(jù)移動(dòng)到另外一個(gè)數(shù)據(jù)庫(kù)或者從另一個(gè)數(shù)據(jù)庫(kù)獲得數(shù)據(jù)的細(xì)節(jié)問(wèn)題。如圖1.11顯示了 ADO.NET架構(gòu)總覽。
圖1.11 通過(guò)ADO.NET訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的接口模型
5. JDBC數(shù)據(jù)庫(kù)接口
JDBC(Java Data Base Connectivity)是Java Soft公司開(kāi)發(fā)的,一組Java語(yǔ)言編寫(xiě)的用于數(shù)據(jù)庫(kù)連接和操作的類(lèi)和接口,可為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一的訪(fǎng)問(wèn)方式。通過(guò)JDBC完成對(duì)數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)包括四個(gè)主要組件:Java應(yīng)用程序、JDBC驅(qū)動(dòng)器管理器、驅(qū)動(dòng)器和數(shù)據(jù)源。
在JDBC?API中有兩層接口:應(yīng)用程序?qū)雍万?qū)動(dòng)程序?qū)?,前者使開(kāi)發(fā)人員可以通過(guò)SQL調(diào)用數(shù)據(jù)庫(kù)和取得結(jié)果,后者處理與具體數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序的所有通訊。
使用JDBC接口對(duì)數(shù)據(jù)庫(kù)操作有如下優(yōu)點(diǎn):
(1).JDBC?API與ODBC十分相似,有利于用戶(hù)理解;
(2)使編程人員從復(fù)雜的驅(qū)動(dòng)器調(diào)用命令和函數(shù)中解脫出來(lái),而致力于應(yīng)用程序功能的實(shí)現(xiàn);
(3)JDBC支持不同的關(guān)系數(shù)據(jù)庫(kù),增強(qiáng)了程序的可移植性。
使用JDBC的主要缺點(diǎn):訪(fǎng)問(wèn)數(shù)據(jù)記錄的速度會(huì)受到一定影響,此外,由于JDBC結(jié)構(gòu)中包含了不同廠(chǎng)家的產(chǎn)品,這給數(shù)據(jù)源的更改帶來(lái)了較大麻煩。
4. 數(shù)據(jù)庫(kù)連接池技術(shù)
對(duì)于網(wǎng)絡(luò)環(huán)境下的數(shù)據(jù)庫(kù)應(yīng)用,由于用戶(hù)眾多,使用傳統(tǒng)的JDBC方式進(jìn)行數(shù)據(jù)庫(kù)連接,系統(tǒng)資源開(kāi)銷(xiāo)過(guò)大成為制約大型企業(yè)級(jí)應(yīng)用效率的瓶頸,采用數(shù)據(jù)庫(kù)連接池技術(shù)對(duì)數(shù)據(jù)庫(kù)連接進(jìn)行管理,可以大大提高系統(tǒng)的效率和穩(wěn)定性。
1.3.2 客戶(hù)/服務(wù)器(C/S)模式應(yīng)用系統(tǒng)
Microsoft公司開(kāi)發(fā)的SQL Server數(shù)據(jù)庫(kù)管理系統(tǒng)當(dāng)前最流行的版本仍然是SQL Server2000,本書(shū)介紹SQL Server2000。
數(shù)據(jù)庫(kù)管理系統(tǒng)通過(guò)命令和適合專(zhuān)業(yè)人員的界面操作數(shù)據(jù)庫(kù)。對(duì)于SQL Server2000數(shù)據(jù)庫(kù)管理系統(tǒng),用戶(hù)在SQL Server 2000的查詢(xún)分析器中輸入SQL命令,系統(tǒng)執(zhí)行的結(jié)果返回到查詢(xún)分析器上顯示。用戶(hù)可以直接通過(guò)SQL Server 2000的企業(yè)管理器的界面操作數(shù)據(jù)庫(kù)。
圖1.12 數(shù)據(jù)庫(kù)應(yīng)用程序與數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)管理系統(tǒng)之間的關(guān)系
1.3.3 三層客戶(hù)/服務(wù)器(B/S)模式應(yīng)用系統(tǒng)
基于Web的數(shù)據(jù)庫(kù)應(yīng)用采用三層客戶(hù)/服務(wù)器模式,也稱(chēng)B/S結(jié)構(gòu)。第一層為瀏覽器,第二層為Web服務(wù)器,第三層為數(shù)據(jù)庫(kù)服務(wù)器。
瀏覽器是用戶(hù)輸入數(shù)據(jù)和顯示結(jié)果的交互界面,用戶(hù)在瀏覽器表單中輸入數(shù)據(jù),然后將表單中的數(shù)據(jù)提交并發(fā)送到Web服務(wù)器,Web服務(wù)器應(yīng)用程序接受并處理
用戶(hù)的數(shù)據(jù),通過(guò)數(shù)據(jù)庫(kù)服務(wù)器,從數(shù)據(jù)庫(kù)中查詢(xún)需要的數(shù)據(jù)(或把數(shù)據(jù)錄入數(shù)據(jù)庫(kù))送Web服務(wù)器,Web服務(wù)器把返回的結(jié)果插入HTML頁(yè)面,傳送到客戶(hù)
端,在瀏覽器中顯示出來(lái)。如圖1.13所示。
Java連接數(shù)據(jù)庫(kù)的方式有多種:根據(jù)所需要的不同數(shù)據(jù)庫(kù)驅(qū)動(dòng)分,分為四種:
1:1類(lèi)驅(qū)動(dòng)。這就是JDBC-ODBC橋的方式。
但這種方式不適合程序的重用與維護(hù),不推薦使用。需要數(shù)據(jù)庫(kù)的ODBC驅(qū)動(dòng)。
2:2類(lèi)驅(qū)動(dòng)。這就是JDBC+廠(chǎng)商API的形式。
廠(chǎng)商API一般使用C編寫(xiě),所以,這種方式也不長(zhǎng)使用。
3:3類(lèi)驅(qū)動(dòng)。這就是JDBC+廠(chǎng)商Database Connection Server+DataBase的形式。
這種方法就是在JAVA 與 DATABASE之間價(jià)起了一臺(tái)專(zhuān)門(mén)用與數(shù)據(jù)庫(kù)連接的服務(wù)器(一般由數(shù)據(jù)庫(kù)廠(chǎng)商提供)。
他的好處在于能優(yōu)化連接。
4:4類(lèi)驅(qū)動(dòng)。這就是純JDBC+DATABASE的連接方式。也是推薦的連接方式。
這使得APPLICATION與數(shù)據(jù)庫(kù)分開(kāi),開(kāi)發(fā)者只需關(guān)心內(nèi)部邏輯的實(shí)現(xiàn)而不需注重?cái)?shù)據(jù)庫(kù)連接的具體實(shí)現(xiàn)。
在這其中有兩種連接的方式:硬編碼方式,就是在程序中硬性編入數(shù)據(jù)庫(kù)連接的所須參數(shù)。
JNDI DataSource方式。就是在程序運(yùn)行的外布環(huán)境中又稱(chēng)(Context)設(shè)置一個(gè)datasource數(shù)據(jù)源,有一個(gè)jndi 名稱(chēng),程序只須查找此名稱(chēng)就可得到一個(gè)數(shù)據(jù)庫(kù)連接的對(duì)象。
Type 1: jdbc-odbc橋 Jdbc-odbc 橋 是sun公司提供的,是jdk提供的的標(biāo)準(zhǔn)api.
這種類(lèi)型的驅(qū)動(dòng)實(shí)際是把所有 jdbc的調(diào)用傳遞給odbc ,再由odbc調(diào)用本地?cái)?shù)據(jù)庫(kù)驅(qū)動(dòng)代碼.( 本地?cái)?shù)據(jù)庫(kù)驅(qū)動(dòng)代碼是指 由數(shù)據(jù)庫(kù)廠(chǎng)商提供的數(shù)據(jù)庫(kù)操作二進(jìn)制代碼庫(kù),例如在Oracle for windows中就是oci dll 文 件)
只要本地機(jī)裝有相關(guān)的odbc驅(qū)動(dòng)那么采用jdbc-odbc橋幾乎可以訪(fǎng)問(wèn)所有的數(shù)據(jù)庫(kù),jdbc- odbc方法對(duì)于客戶(hù)端已經(jīng)具備odbc driver的應(yīng)用還是可行的。
但是,由于jdbc-odbc先調(diào)用 odbc再由odbc去調(diào)用本地?cái)?shù)據(jù)庫(kù)接口訪(fǎng)問(wèn)數(shù)據(jù)庫(kù).所以,執(zhí)行效率比較低,對(duì)于那些大數(shù)據(jù)量 存取的應(yīng)用是不適合的.
而且,這種方法要求客戶(hù)端必須安裝odbc 驅(qū)動(dòng),所以對(duì)于基于 internet ,intranet的應(yīng)用也是不合適的.因?yàn)?你不可能要求所有客戶(hù)都能找到odbc driver.
=====一般ACCESS用到的比較多,初學(xué)者用。實(shí)際項(xiàng)目是不用的
Type 2: 本地Api驅(qū)動(dòng)
本地api驅(qū)動(dòng)直接把jdbc調(diào)用轉(zhuǎn)變?yōu)閿?shù)據(jù)庫(kù)的標(biāo)準(zhǔn)調(diào)用再去訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)。
這種方法需要本地 數(shù)據(jù)庫(kù)驅(qū)動(dòng)代碼. 本地api驅(qū)動(dòng)|廠(chǎng)商DB代碼---數(shù)據(jù)庫(kù)Server這種驅(qū)動(dòng)比起jdbc-odbc橋執(zhí)行效率大大提高了.
但是,它仍然需要在客戶(hù)端加載數(shù)據(jù)庫(kù)廠(chǎng)商 提供的代碼庫(kù).這樣就不適合基于internet的應(yīng)用.并且,他的執(zhí)行效率比起3,4型的jdbc驅(qū)動(dòng) 還是不夠高。
Type3:網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)
這種驅(qū)動(dòng)實(shí)際上是根據(jù)我們熟悉的三層結(jié)構(gòu)建立的. jdbc先把對(duì)數(shù)局庫(kù)的訪(fǎng)問(wèn)請(qǐng)求傳遞給網(wǎng) 絡(luò)上的中間件服務(wù)器. 中間件服務(wù)器再把請(qǐng)求翻譯為符合數(shù)據(jù)庫(kù)規(guī)范的調(diào)用,
再把這種調(diào)用傳給數(shù)據(jù)庫(kù)服務(wù)器.如果中間件服務(wù)器也是用java開(kāi)發(fā)的,那么在在中間層也可以使用1,2型 jdbc驅(qū)動(dòng)程序作為訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的方法.
網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)--中間件服務(wù)器---數(shù)據(jù)庫(kù)Server
由于這種驅(qū)動(dòng)是基于server的.所以,它不需要在客戶(hù)端加載數(shù)據(jù)庫(kù)廠(chǎng)商提供的代碼庫(kù).而且 他在執(zhí)行效率和可升級(jí)性方面是比較好的.因?yàn)榇蟛糠止δ軐?shí)現(xiàn)都在server端,
所以這種驅(qū)動(dòng) 可以設(shè)計(jì)的很小,可以非??焖俚募虞d到內(nèi)存中. 但是,這種驅(qū)動(dòng)在中間件層仍然需要有配置 其它數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,并且由于多了一個(gè)中間層傳遞數(shù)據(jù),
它的執(zhí)行效率還不是最好.
Type4 純JAVA驅(qū)動(dòng)
這種驅(qū)動(dòng)直接把jdbc調(diào)用轉(zhuǎn)換為符合相關(guān)數(shù)據(jù)庫(kù)系統(tǒng)規(guī)范的請(qǐng)求.由于4型驅(qū)動(dòng)寫(xiě)的應(yīng)用可 以直接和數(shù)據(jù)庫(kù)服務(wù)器通訊.這種類(lèi)型的驅(qū)動(dòng)完全由java實(shí)現(xiàn),
因此實(shí)現(xiàn)了平臺(tái)獨(dú)立性. 本地協(xié)議驅(qū)動(dòng)---------數(shù)據(jù)庫(kù)Server
由于這種驅(qū)動(dòng)不需要先把jdbc的調(diào)用傳給odbc或本地?cái)?shù)據(jù)庫(kù)接口或者是中間層服務(wù)器.所以它的執(zhí)行效率是非常高的.而且,它根本不需要在客戶(hù)端或服務(wù)器端裝載任何的軟件
或驅(qū)動(dòng). 這種驅(qū)動(dòng)程序可以動(dòng)態(tài)的被下載.但是對(duì)于不同的數(shù)據(jù)庫(kù)需要下載不同的驅(qū)動(dòng)程序.
以上對(duì)四種類(lèi)型的jdbc驅(qū)動(dòng)做了一個(gè)說(shuō)明.那么它們適合那種類(lèi)型的應(yīng)用開(kāi)發(fā)呢?
提示:Jdbc-odbc橋由于它的執(zhí)行效率不高,更適合做為開(kāi)發(fā)應(yīng)用時(shí)的一種過(guò)度方案,或著對(duì)于初學(xué) 者了解jdbc編程也較適用.
對(duì)于那些需要大數(shù)據(jù)量操作的應(yīng)用程序則應(yīng)該考慮2,3,4型驅(qū)動(dòng).在intranet方面的應(yīng)用可以考慮2型驅(qū)動(dòng),
但是由于3,4型驅(qū)動(dòng)在執(zhí)行效率上比2型驅(qū)動(dòng)有著明顯的優(yōu)勢(shì),而且目前開(kāi)發(fā) 的趨勢(shì)是使用純java.所以3,4型驅(qū)動(dòng)也可以作為考慮對(duì)象. 至于基于internet方面的應(yīng)用就只有考慮3,4型驅(qū)動(dòng)了.
因?yàn)?型驅(qū)動(dòng)可以把多種數(shù)據(jù)庫(kù)驅(qū)動(dòng)都配置在中間層服務(wù)器.所以3型驅(qū)動(dòng)最適合那種需要同時(shí)連接多個(gè)不同種類(lèi)的數(shù)據(jù)庫(kù), 并且對(duì)并發(fā)連接要求高的應(yīng)用.4型驅(qū)動(dòng)則適合那些連接單一數(shù)據(jù)庫(kù)的工作組應(yīng)用。
1. ODBC技術(shù)
1.1 ODBC介紹
ODBC(Open Database Connectivity,開(kāi)放數(shù)據(jù)庫(kù)互 連)是微軟公司開(kāi)放服務(wù)結(jié)構(gòu)(WOSA,Windows Open Services Architecture)中有關(guān)數(shù)據(jù)庫(kù)的一個(gè)組成部分,它建立了一組規(guī)范,并提供了一組對(duì)數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的標(biāo)準(zhǔn)API(應(yīng)用程序編程接口)。這些API利用 SQL來(lái)完成其大部分任務(wù)。ODBC本身也提供了對(duì)SQL語(yǔ)言的支持,用戶(hù)可以直接將SQL語(yǔ)句送給ODBC。
ODBD通過(guò)引進(jìn)ODBC驅(qū)動(dòng)當(dāng)作應(yīng)用程序與DBMS的中間翻譯層,來(lái)實(shí)現(xiàn)ODBC接口與DBMS的無(wú)關(guān)性。實(shí)現(xiàn)了ODBC接口的應(yīng)用程序可以訪(fǎng)問(wèn)任何安裝了ODBC驅(qū)動(dòng)的DBMS。
應(yīng)用程序要訪(fǎng)問(wèn)一個(gè)數(shù)據(jù)庫(kù),首先必須用ODBC管理器注冊(cè)一個(gè)數(shù)據(jù)源,管理器根據(jù)數(shù)據(jù)源提供的數(shù)據(jù)庫(kù)位置、數(shù)據(jù)庫(kù)類(lèi)型及ODBC驅(qū)動(dòng)程序等信息,建立起ODBC與具體數(shù)據(jù)庫(kù)的聯(lián)系。這樣,只要應(yīng)用程序?qū)?shù)據(jù)源名提供給ODBC,ODBC就能建立起與相應(yīng)數(shù)據(jù)庫(kù)的連接。
在64位系統(tǒng)中打開(kāi)ODBC管理器的方法為:
(1)查看兼容的32位ODBC驅(qū)動(dòng):?jiǎn)?dòng) C:/Windows/SysWOW64/odbcad32.exe;
(2)查看64位ODBC驅(qū)動(dòng),啟動(dòng)C:/WINDOWS/system32/odbcad32.exe 或者【控制面板】-【管理工具】-【數(shù)據(jù)源(ODBC)】。
1.2 ODBC的由來(lái)
早期數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)是由本機(jī)庫(kù)來(lái)執(zhí)行的,例如SQL Server的DBLib以及Oracle的OCI(Oracle Call Interface,Oracle調(diào)用接口)。這樣能保證快速地訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),但是不同的數(shù)據(jù)庫(kù)要使用不同的API來(lái)訪(fǎng)問(wèn),導(dǎo)致代碼通用性很差。
為了解決這個(gè)問(wèn)題,1992年Microsoft和Sybase、Digital共同制定了ODBC標(biāo)準(zhǔn)接口,以單一的ODBC API來(lái)存取各種不同的數(shù)據(jù)庫(kù)。隨后ODBC便獲得了許多數(shù)據(jù)庫(kù)廠(chǎng)商和Third-Party的支持而逐漸成為標(biāo)準(zhǔn)的數(shù)據(jù)存取技術(shù)。
ODBC以當(dāng)時(shí)的業(yè)界標(biāo)準(zhǔn)規(guī)范X/Open Call Level Interface(CLI)和ISO/IEC9075-3Call-LevelInterface(SQL/CLI)為涵蓋的范圍,因而支持了廣闊的數(shù) 據(jù)庫(kù)。雖然ODBC在初期的版本中執(zhí)行效率不佳,而且功能有限,因此也為人們所貶低。但是,隨著Microsoft不斷地改善ODBC,使ODBC的執(zhí)行 效率不斷增加,ODBC驅(qū)動(dòng)程序的功能也日漸齊全。到目前,ODBC已經(jīng)是一個(gè)穩(wěn)定并且執(zhí)行效率良好的數(shù)據(jù)存取引擎。不過(guò)ODBC僅支持關(guān)系數(shù)據(jù)庫(kù),以及傳統(tǒng)的數(shù)據(jù)庫(kù)數(shù)據(jù)類(lèi)型,并且只以C/C++語(yǔ)言API(API就是一些C語(yǔ)言的代碼,是最底層的程序,在windows中就是一些.dll的文件)形式提供服務(wù),因而無(wú)法符合日漸復(fù)雜的數(shù)據(jù)存取應(yīng)用,也無(wú)法讓腳本語(yǔ)言使用。因此Microsoft除了ODBC之外,也推出了其他的數(shù)據(jù)存取技術(shù)以滿(mǎn)足程序員不同的需要。(注:ODBC是面向過(guò)程的語(yǔ)言,由C語(yǔ)言開(kāi)發(fā)出來(lái),不能兼容多種語(yǔ)言,所以開(kāi)發(fā)的難度大,而且只支持有限的數(shù)據(jù)庫(kù)公司,對(duì)于后來(lái)的EXCEL等根本不能支持)。
盡管可以編寫(xiě)直接利用ODBC API的應(yīng)用程序,但這是相當(dāng)復(fù)雜的。為了避免這種復(fù)雜性,微軟引入了兩個(gè)對(duì)象模型:DAO(Data Access Object)與RDO(Remote DataObject),可以通過(guò)過(guò)程性的ODBC API實(shí)現(xiàn)面向?qū)ο蟮脑L(fǎng)問(wèn)。
2. OLE-DB技術(shù)
2.1 OLE DB的由來(lái)
隨著數(shù)據(jù)源日益復(fù)雜化,現(xiàn)今的應(yīng)用程序很可能需要從不同的數(shù)據(jù)源取得數(shù)據(jù),加以處理,再把處理過(guò)的數(shù)據(jù)輸出到另外一個(gè)數(shù)據(jù)源中。更麻煩的是這些數(shù)據(jù) 源可能不是傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù),而可能是Excel文件,Email,Internet/Intranet上的電子簽名信息。Microsoft為了讓?xiě)?yīng)用 程序能夠以統(tǒng)一的方式存取各種不同的數(shù)據(jù)源,在1997年提出了Universal Data Access(UDA)架構(gòu)。UDA以COM技術(shù)為核心,協(xié)助程序員存取企業(yè)中各類(lèi)不同的數(shù)據(jù)源。UDA以O(shè)LE-DB(屬于操作系統(tǒng)層次的軟件)作為技術(shù)的骨架。OLE-DB定義了統(tǒng)一的COM接口作為存取各類(lèi)異質(zhì)數(shù)據(jù)源的標(biāo)準(zhǔn),并且封裝在一組COM對(duì)象之中。藉由OLE-DB,程序員就可以使用一致的方式來(lái)存取各種數(shù)據(jù)。但仍然OLEDB是一個(gè)低層次的,利用效率不高。
2.2 OLE DB的介紹
OLE DB(Object Linking and Embedding, Database,即對(duì)象連接與嵌入)是微軟的戰(zhàn)略性的通向不同的數(shù)據(jù)源的低級(jí)應(yīng)用程序接口。OLE DB不僅包括微軟資助的標(biāo)準(zhǔn)數(shù)據(jù)接口開(kāi)放數(shù)據(jù)庫(kù)連通性(ODBC)的結(jié)構(gòu)化查詢(xún)語(yǔ)言(SQL)能力,還具有面向其他非SQL數(shù)據(jù)類(lèi)型的通路。作為微軟的組 件對(duì)象模型(COM)的一種設(shè)計(jì),OLE DB是一組讀寫(xiě)數(shù)據(jù)的方法(在過(guò)去可能被稱(chēng)為渠道)。OLD DB中的對(duì)象主要包括數(shù)據(jù)源對(duì)象、階段對(duì)象、命令對(duì)象和行組對(duì)象。使用OLEDB的應(yīng)用程序會(huì)用到如下的請(qǐng)求序列:初始化OLE連接到數(shù)據(jù)源à發(fā)出命令à 處理結(jié)果à釋放數(shù)據(jù)源對(duì)象并停止初始化OLE。
OLE DB標(biāo)準(zhǔn)中定義的新概念——OLE DB將傳統(tǒng)的數(shù)據(jù)庫(kù)系統(tǒng)劃分為多個(gè)邏輯組件,這些組件之間相對(duì)獨(dú)立又相互通信。這種組件模型中的各個(gè)部分被冠以不同的名稱(chēng),例如數(shù)據(jù)提供者(Data Provider)是指提供數(shù)據(jù)存儲(chǔ)的軟件組件,小到普通的文本文件、大到主機(jī)上的復(fù)雜數(shù)據(jù)庫(kù),或者電子郵件存儲(chǔ),都是數(shù)據(jù)提供者的例子。有的文檔把這些 軟件組件的開(kāi)發(fā)商也稱(chēng)為數(shù)據(jù)提供者。
我們要開(kāi)啟如Access數(shù)據(jù)庫(kù)中的數(shù)據(jù),必須用ADO.NET通過(guò)OLE DB來(lái)開(kāi)啟。ADO.Net 利用OLE DB來(lái)取得數(shù)據(jù),這是因?yàn)镺LE DB了解如何和許多種數(shù)據(jù)源作溝通,所以對(duì)OLE DB有相當(dāng)程度的了解是很重要的。
OLEDB 為一種開(kāi)放式的標(biāo)準(zhǔn),并且設(shè)計(jì)成COM(ComponentObject Model,一種對(duì)象的格式。凡是依照COM 的規(guī)格所制作出來(lái)的組件,皆可以提供功能讓其它程序或組件所使用。)組件。OLEDB 最主要是由三個(gè)部分組合而成:
(1)Data Providers數(shù)據(jù)提供者
地位相當(dāng)于ODBC的驅(qū)動(dòng)程序,負(fù)責(zé)從數(shù)據(jù)源中提供數(shù)據(jù)。凡是透過(guò)OLEDB將數(shù)據(jù)提供出來(lái)的,就是數(shù)據(jù)提供者。例如SQL Server 數(shù)據(jù)庫(kù)中的數(shù)據(jù)表,或是附文件名為mdb 的Access 數(shù)據(jù)庫(kù)檔案等,都是Data Provider。
(2)Data Consumers數(shù)據(jù)使用者
凡是使用OLEDB 提供數(shù)據(jù)的程序或組件,都是OLEDB 的數(shù)據(jù)使用者。換句話(huà)說(shuō),凡是使用ADO 的應(yīng)用程序或網(wǎng)頁(yè)都是OLE DB 的數(shù)據(jù)使用者。
(3)Service Components服務(wù)組件
數(shù)據(jù)服務(wù)組件可以執(zhí)行數(shù)據(jù)提供者以及數(shù)據(jù)使用者之間數(shù)據(jù)傳遞的工作,數(shù)據(jù)使用者要向數(shù)據(jù)提供者要求數(shù)據(jù)時(shí),是透過(guò)OLEDB 服務(wù)組件的查詢(xún)處理器執(zhí)行查詢(xún)的工作,而查詢(xún)到的結(jié)果則由指針引擎來(lái)管理。
2.3 OLE DB和ODBC的區(qū)別
由于OLEDB和ODBC標(biāo)準(zhǔn)都是為了提供統(tǒng)一的訪(fǎng)問(wèn)數(shù)據(jù)接口,所以曾經(jīng)有人疑惑:OLE DB是不是替代ODBC的新標(biāo)準(zhǔn)?答案是否定的。實(shí)際上,ODBC標(biāo)準(zhǔn)的對(duì)象是基于SQL的數(shù)據(jù)源(SQL-Based Data Source),而OLE DB的對(duì)象則是范圍更為廣泛的任何數(shù)據(jù)存儲(chǔ)。從這個(gè)意義上說(shuō),符合ODBC標(biāo)準(zhǔn)的數(shù)據(jù)源是符合OLE DB標(biāo)準(zhǔn)的數(shù)據(jù)存儲(chǔ)的子集。
3. ADO技術(shù)
3.1 ADO的由來(lái)
雖然OLE-DB允許程序員存取各類(lèi)數(shù)據(jù),是一個(gè)非常良好的架構(gòu),但是由于OLE-DB太底層化,而且在使用上非常復(fù)雜,需要程序員擁有高超的技 巧,因此只有少數(shù)的程序員才有辦法使用OLE-DB。這讓OLE-DB無(wú)法廣為流行。為了解決這個(gè)問(wèn)題,并且讓VB和腳本語(yǔ)言也能夠藉由OLE-DB存取 各種數(shù)據(jù)源,Microsoft同樣以COM技術(shù)封裝OLE-DB為ADO對(duì)象(這一步是很重要的,實(shí)現(xiàn)了多種程序可以互相調(diào),并且可以開(kāi)發(fā)的語(yǔ)言也豐富 了),簡(jiǎn)化了程序員數(shù)據(jù)存取的工作。由于 ADO成功地封裝了OLE-DB大部分的功能,并且大量簡(jiǎn)化了數(shù)據(jù)存取工作,因此 ADO也逐漸被愈來(lái)愈多的程序員所接受。
3.2 ADO的介紹
微軟公司的ADO(ActiveX Data Objects)是一個(gè)用于存取數(shù)據(jù)源的COM組件。它提供了編程語(yǔ)言和統(tǒng)一數(shù)據(jù)訪(fǎng)問(wèn)方式OLE DB的一個(gè)中間層。允許開(kāi)發(fā)人員編寫(xiě)訪(fǎng)問(wèn)數(shù)據(jù)的代碼而不用關(guān)心數(shù)據(jù)庫(kù)是如何實(shí)現(xiàn)的,而只用關(guān)心到數(shù)據(jù)庫(kù)的連接。訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的時(shí)候,關(guān)于SQL的知識(shí)不是必要的,但是特定數(shù)據(jù)庫(kù)支持的SQL命令仍可以通過(guò)ADO中的命令對(duì)象來(lái)執(zhí)行。
ADO被設(shè)計(jì)來(lái)繼承微軟早期的數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象層,包括RDO(Remote Data Objects)和DAO(Data Access Objects)。ADO在1996年冬被發(fā)布。
ADO包括了6個(gè)類(lèi):Connection,Command,Recordset,Errors,Parameters,F(xiàn)ields。
說(shuō)通俗點(diǎn)OLE DB和ODBC都是最底層的東西,而ADO對(duì)象給我們提供了一個(gè)“可視化”地和應(yīng)用層直接交互的組件,我們不用過(guò)多的關(guān)注OLEDB的內(nèi)部機(jī)制,只需要了 解ADO通過(guò)OLE DB創(chuàng)建數(shù)據(jù)源的幾種方法即可,就可以通過(guò)ADO輕松地獲取數(shù)據(jù)源??梢哉f(shuō)ADO是應(yīng)用程序和數(shù)據(jù)底層的一個(gè)中間層,ADO對(duì)象通過(guò)OLE DB間接取得數(shù)據(jù)庫(kù)中的數(shù)據(jù)。OLE DB只是提供了通向各種數(shù)據(jù)庫(kù)的一個(gè)通用接口,簡(jiǎn)單的可以用圖1來(lái)表示:
圖1 采用ADO和OLEDB訪(fǎng)問(wèn)數(shù)據(jù)源
4. ADO.NET技術(shù)
ADO和ADO.NET的目的都是為編寫(xiě)數(shù)據(jù)源訪(fǎng)問(wèn)程序提供支持,但它們是兩種完全不同的技術(shù)。
ADO使用OLE
DB接口并基于微軟的COM技術(shù),而ADO.NET基于微軟的.NET體系架構(gòu),擁有自己的ADO.NET數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)接口。眾所周知.NET體系不同于
COM體系,ADO.NET接口也就完全不同于A(yíng)DO和OLE DB接口,這也就是說(shuō)ADO.NET和ADO是兩種數(shù)據(jù)訪(fǎng)問(wèn)方式。
在開(kāi)始設(shè)計(jì).NET體系架構(gòu)時(shí),微軟就決定重新設(shè)計(jì)數(shù)據(jù)訪(fǎng)問(wèn)模型,以便能夠完全的基于XML和離線(xiàn)計(jì)算模型。兩者的區(qū)別主要有:
(1)ADO以Recordset存儲(chǔ),而ADO.NET則以DataSet存儲(chǔ)。Recordset看起來(lái)更像單表,如果讓Recordset以多表的方式表示就必須在SQL中進(jìn)行多表連接。反之,DataSet可以是多個(gè)表的集合。
(2)ADO的運(yùn)作是一種在線(xiàn)方式,這意味著不論是瀏覽或更新數(shù)據(jù)都必須是實(shí)時(shí)的。ADO.NET則使用離線(xiàn)方式,在訪(fǎng)問(wèn)數(shù)據(jù)的時(shí)候ADO.NET會(huì)利用XML制作數(shù)據(jù)的一份副本,ADO.NET的數(shù)據(jù)庫(kù)連接也只有在這段時(shí)間需要在線(xiàn)。
(3)由于A(yíng)DO使用COM技術(shù),這就要求所使用的數(shù)據(jù)類(lèi)型必須符合COM規(guī)范,而ADO.NET基于XML格式,數(shù)據(jù)類(lèi)型更為豐富并且不需要再做COM編排導(dǎo)致的數(shù)據(jù)類(lèi)型轉(zhuǎn)換,從而提高了整體性能。
圖2描繪了ADO.NET體系。圖3給出了ADO.NET基于XML進(jìn)行數(shù)據(jù)傳遞的原理圖。
圖2ADO.NET架構(gòu)體系
圖3ADO.NET數(shù)據(jù)訪(fǎng)問(wèn)原理
5. JDBC技術(shù)
5.1 JDBC介紹
JDBC(Java Database Connectivity,Java數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行SQL語(yǔ)句的Java API,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪(fǎng)問(wèn),它由一組用Java語(yǔ)言編寫(xiě)的類(lèi)和接口組成。
JDBC與ODBC一樣,也是很底層的接口,可以直接調(diào)用SQL命令。在它之上可以建立高級(jí)接口和工具。高級(jí)接口是“用戶(hù)友好”的接口,它使用的是一種更易理解和更為方便的 API,這種API在幕后被轉(zhuǎn)換為諸如 JDBC 這樣的低級(jí)接口。
5.2 JDBC與ODBC對(duì)比
Microsoft 的 ODBC API 可能是使用最廣的、用于訪(fǎng)問(wèn)關(guān)系數(shù)據(jù)庫(kù)的編程接口。它能在幾乎所有平臺(tái)上連接幾乎所有的數(shù)據(jù)庫(kù)。為什么
Java 不使用 ODBC?對(duì)這個(gè)問(wèn)題的回答是:Java 可以使用 ODBC,但最好是在 JDBC
的幫助下以JDBC-ODBC橋的形式使用,原因是ODBC 不適合直接在 Java 中使用,因?yàn)樗褂?C 語(yǔ)言接口。從Java 調(diào)用本地
C代碼在安全性、實(shí)現(xiàn)、堅(jiān)固性和程序的自動(dòng)移植性方面都有許多缺點(diǎn)。從ODBC C API 到 Java API的字面翻譯是不可取的。例如,Java
沒(méi)有指針,而 ODBC 卻對(duì)指針用得很廣泛(包括很容易出錯(cuò)的指針"void *")。
JDBC與ODBC都是基于X/Open的SQL調(diào)用級(jí)接口, JDBC的設(shè)計(jì)在思想上沿襲了ODBC,同時(shí)在其主要抽象和SQL CLI實(shí)現(xiàn)上也沿襲了ODBC,這使得JDBC容易被接受。JDBC的總體結(jié)構(gòu)類(lèi)似于ODBC,也有四個(gè)組件:應(yīng)用程序、驅(qū)動(dòng)程序管理器、驅(qū)動(dòng)程序和數(shù)據(jù)源。
JDBC保持了ODBC的基本特性,也獨(dú)立于特定數(shù)據(jù)庫(kù)。使用相同源代碼的應(yīng)用程序通過(guò)動(dòng)態(tài)加載不同的JDBC驅(qū)動(dòng)程序,可以訪(fǎng)問(wèn)不同的DBMS。
連接不同的DBMS時(shí),各個(gè)DBMS之間僅通過(guò)不同的URL進(jìn)行標(biāo)識(shí)。JDBC的
DatabaseMetaData接口提供了一系列方法,可以檢查DBMS對(duì)特定特性的支持,并相應(yīng)確定有什么特性,從而能對(duì)特定數(shù)據(jù)庫(kù)的特性予以支持。
與ODBC一樣,JDBC也支持在應(yīng)用程序中同時(shí)建立多個(gè)數(shù)據(jù)庫(kù)連接,采用JDBC可以很容易地用SQL語(yǔ)句同時(shí)訪(fǎng)問(wèn)多個(gè)異構(gòu)的數(shù)據(jù)庫(kù),為異構(gòu)的數(shù)據(jù)庫(kù)之
間的互操作奠定基礎(chǔ)。
ODBC很難學(xué)。它把簡(jiǎn)單和高級(jí)功能混在一起,而且即使對(duì)于簡(jiǎn)單的查詢(xún),其選項(xiàng)也極為復(fù)雜。相反,JDBC
盡量保證簡(jiǎn)單功能的簡(jiǎn)便性,而同時(shí)在必要時(shí)允許使用高級(jí)功能。如果使用ODBC,就必須手動(dòng)地將ODBC驅(qū)動(dòng)程序管理器和驅(qū)動(dòng)程序安裝在每臺(tái)客戶(hù)機(jī)上。如
果完全用Java編寫(xiě)JDBC驅(qū)動(dòng)程序則JDBC代碼在所有Java平臺(tái)上(從網(wǎng)絡(luò)計(jì)算機(jī)到大型機(jī))都可以自動(dòng)安裝、移植并保證安全性。JDBC確保了
“100%純Java”的解決方案,利用Java的平臺(tái)無(wú)關(guān)性,
JDBC應(yīng)用程序可以自然地實(shí)現(xiàn)跨平臺(tái)特性,因而更適合于Internet上異構(gòu)環(huán)境的數(shù)據(jù)庫(kù)應(yīng)用。此外,JDBC驅(qū)動(dòng)程序管理器是內(nèi)置的,驅(qū)動(dòng)程序本身
也可通過(guò)Web瀏覽器自動(dòng)下載,無(wú)須安裝、配置;而ODBC驅(qū)動(dòng)程序管理器和ODBC驅(qū)動(dòng)程序必須在每臺(tái)客戶(hù)機(jī)上分別安裝、配置。
目前,Microsoft又引進(jìn)了ODBC之外的新API: RDO、ADO和OLE
DB。這些設(shè)計(jì)在許多方面與JDBC是相同的,即它們都是面向?qū)ο蟮臄?shù)據(jù)庫(kù)接口且基于可在ODBC上實(shí)現(xiàn)的類(lèi)。但在這些接口中,我們未看見(jiàn)有特別的功能使
我們要轉(zhuǎn)而選擇它們來(lái)替代ODBC,尤其是在ODBC驅(qū)動(dòng)程序已建立起較為完善的市場(chǎng)的情況下。它們最多也就是在ODBC上加了一種裝飾而已。
6. ODAC
ODAC全稱(chēng)Oracle數(shù)據(jù)訪(fǎng)問(wèn)組件(Oracle Data Access
Components),是由Oracle官方提供的在.NET環(huán)境下進(jìn)行Oracle數(shù)據(jù)庫(kù)編程的一套工具組件。ODAC完全包括了開(kāi)發(fā)所用的組件,例
如ODP.NET、ODT、Oracle Provider for OLE DB等工具,見(jiàn)下圖所示:
圖4ODAC組件內(nèi)容
其中,ODP.NET提供了比ADO.NET更為優(yōu)化的oracle數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)功能。具體見(jiàn)7.1.4;ODT則是Microsoft
Visual Studio 2015,Visual Studio 2013, and Visual Studio
2012的oracle數(shù)據(jù)庫(kù)開(kāi)發(fā)插件。
ODAC的下載地址為http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html??梢酝ㄟ^(guò)Oracle Universal Installer、xcopy、NuGet或者M(jìn)icrosoft Installer進(jìn)行安裝。
7. Oracle數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)技術(shù)
7.1 在.NET環(huán)境下訪(fǎng)問(wèn)Oracle
7.1.1 ODBC方式
首先下載instantclient-basic-win32-11.2.0.1.0.zip和instantclient-odbc-
win32-11.2.0.1.0.zip兩個(gè)文件,將它們解壓,放到同一個(gè)文件夾下面,運(yùn)行odbc_install.exe安裝。注意,oracle
要與其odbc驅(qū)動(dòng)的位數(shù)要匹配,如果不匹配則會(huì)報(bào)“體系結(jié)構(gòu)不匹配”的錯(cuò)誤。
安裝完成后,我們可以在【控制面板】-->【管理工具】-->【數(shù)據(jù)源(ODBC)】-->【系統(tǒng)DSN】中查看系統(tǒng)中已經(jīng)安裝好的ODBC驅(qū)動(dòng),其中就包含了“Microsoft ODBC Driver for Oracle”。
連接字符串格式:
[java] view plain copy
Driver={MicrosoftODBCforOracle};Server=myServerAddress;Uid=myUsername;Pwd=myPassword;
要求:必須安裝oracle 7.3版(或更高)的客戶(hù)端。
7.1.2 OLEDB方式
打開(kāi)注冊(cè)表編輯器,搜索oracle即可以搜索到以下鍵:
Microsoft OLE DBProvider for Oracle
HKEY_CLASSES_ROOTCLSID{e8cc4cbe-fdff-11d0-b865-00a0c9081c1d}OLEDB Provider
HKEY_CLASSES_ROOTMSDAORA
所以,只要安裝了合適版本的MDAC,那么就可以使用OLEDB來(lái)訪(fǎng)問(wèn)ORACLE了。
連接字符串格式:
[java] view plain copy
Provider=msdaora;DataSource=MyOracleDB;UserId=myUsername;Password=myPassword;
要求:必須安裝oracle 8i版(或更高)的客戶(hù)端。
7.1.3 OracleClient方式
OracleClient(System.Data.OracleClient)是微軟針對(duì)Oracle開(kāi)發(fā)所研發(fā)的ADO.NET Data
Provider,從.NET 1.x開(kāi)始,就已成為.NETFramework類(lèi)庫(kù)的一部分,它與微軟Visual Studio
的集成性非常好。但是從.NET 4以后的版本中將會(huì)移除該類(lèi)庫(kù),不再提供OracleClient的支持。
7.1.4 ODP.NET方式
全稱(chēng)Oracle Data Provider for .net,就是Oracle 為 .NET(ODP.NET) 專(zhuān)門(mén)編寫(xiě)了 Oracle Data Provider,一個(gè)用于 Microsoft .NET 環(huán)境下的 Oracle 數(shù)據(jù)訪(fǎng)問(wèn) API 。
要想從 Oracle 所支持的企業(yè)應(yīng)用程序獲得預(yù)期的響應(yīng)性能和高級(jí)數(shù)據(jù)庫(kù)特性,應(yīng)該選擇 Oracle
專(zhuān)用的連接而不是一般的數(shù)據(jù)庫(kù)連接。Java 開(kāi)發(fā)人員長(zhǎng)期以來(lái)一直可以選擇使用 Oracle 提供的專(zhuān)用 API 連接到 Oracle
數(shù)據(jù)庫(kù),這些 API 擴(kuò)展了 JDBC 并為開(kāi)發(fā)人員利用如大型對(duì)象 (LOB) 和 Ref Cursor 這樣的 Oracle
高級(jí)特性提供了一條途徑。
2002 年 2 月,Microsoft 推出了 Visual Studio .NET 及其三種語(yǔ)言(C# .NET、Visual
Basic .NET 和 C++ .NET)以及底層的 .NET 框架。Microsoft .NET 為建立企業(yè)級(jí)的桌面、Web 和
client/server 應(yīng)用程序提供了一個(gè)面向?qū)ο蟮拈_(kāi)發(fā)平臺(tái)。不幸的是,使用這些 Microsoft 語(yǔ)言和 .NET
框架的開(kāi)發(fā)人員并沒(méi)有一個(gè)現(xiàn)成的、專(zhuān)用于 Oracle 的數(shù)據(jù)庫(kù)連接選項(xiàng)。
針對(duì)這一問(wèn)題,Oracle 為 .NET(ODP.NET) 專(zhuān)門(mén)編寫(xiě)了 Oracle Data Provider,一個(gè)用于
Microsoft .NET 環(huán)境下的 Oracle 數(shù)據(jù)訪(fǎng)問(wèn) API。在本文中,我們將討論 ODP.NET
的用法、特性和對(duì)性能的改善。我們發(fā)現(xiàn)使用 ODP.NET 確實(shí)具有一些顯著的優(yōu)勢(shì)。
如果用ODP.NET來(lái)訪(fǎng)問(wèn)ORACLE數(shù)據(jù)庫(kù),需要滿(mǎn)足以下條件:
l 操作系統(tǒng)WIN XP 2003;
l .NET FRAMEWORK 1.0以上;
l ORACLE9I以上的客戶(hù)端。
連接字符串格式:
[java] view plain copy
DataSource=MyOracleDB;UserId=myUsername;Password=myPassword;IntegratedSecurity=no;
7.2 在JAVA環(huán)境下訪(fǎng)問(wèn)Oracle
在Java環(huán)境下主要通過(guò)JDBC連接Oracle。連接方式主要有兩種。
(1)使用JDBC thin連接
thin是for thin client的意思,這種驅(qū)動(dòng)一般用在運(yùn)行于WEB瀏覽器中的JAVA程序。它不是通過(guò)OCI or
Net8,而是通過(guò)Javasockets進(jìn)行通信,是純java實(shí)現(xiàn)的驅(qū)動(dòng),因此與平臺(tái)無(wú)關(guān),不需要在使用JDBC
Thin的客戶(hù)端機(jī)器上安裝Oracle客戶(hù)端軟件,只需要下載一個(gè)thin驅(qū)動(dòng)的jar包,并且將環(huán)境變量中的CLASS_PATH變量中加入thin
驅(qū)動(dòng)的路徑就可以了。所以有很好的移植性,通常用在web開(kāi)發(fā)中。
Thin驅(qū)動(dòng)雖然與平臺(tái)無(wú)關(guān),也無(wú)需安裝Oracle客戶(hù)端,但是有一個(gè)致命的缺陷就是性能一般,達(dá)不到如OCI方式的企業(yè)級(jí)的要求。另外,如果一
個(gè)oracle數(shù)據(jù)庫(kù)對(duì)應(yīng)一臺(tái)主機(jī),可以使用thin連接;如果一個(gè)oracle數(shù)據(jù)庫(kù)對(duì)應(yīng)四五臺(tái)主機(jī)(集群服務(wù)器),使用thin時(shí),需要把
tnsnames.ora文件中的相關(guān)數(shù)據(jù)庫(kù)的整個(gè)連接字符串都拷貝下來(lái),如此才能連接上oracle集群數(shù)據(jù)庫(kù)。
設(shè)置連接字符串是固定的寫(xiě)法,如下所示:
[java] view plain copy
Class.forName("oracle.jdbc.driver.OracleDriver");
Connectionconn=DriverManager.getConnection("jdbc:oracle:thin:@10.87.134.107:1521:ora9","sms","zzsms");
在上面的連接字符串中,如果不是集群數(shù)據(jù)庫(kù)就在@后直接輸入數(shù)據(jù)庫(kù)IP地址即可;如果是集群數(shù)據(jù)庫(kù),則需要在@后輸入tnsnames.ora文件中有關(guān)該數(shù)據(jù)庫(kù)的所有描述內(nèi)容(通常是=后邊的所有的內(nèi)容)。
(2)使用JDBC OCI連接
OCI是oracle call interface的縮寫(xiě),此驅(qū)動(dòng)類(lèi)似于傳統(tǒng)的ODBC驅(qū)動(dòng)。因?yàn)樗枰狾racle Call
Interface and
Net8,所以它需要在運(yùn)行使用此驅(qū)動(dòng)的JAVA程序的機(jī)器上安裝客戶(hù)端軟件,其實(shí)主要是用到oracle客戶(hù)端里以dll方式提供的oci和服務(wù)器配
置。
使用OCI連接數(shù)據(jù)庫(kù)是企業(yè)級(jí)的做法,適應(yīng)于單個(gè)數(shù)據(jù)庫(kù)和集群數(shù)據(jù)庫(kù),性能優(yōu)越,尤其是連接池功能大大提高了應(yīng)用程序的性能和并發(fā)量。唯一的缺點(diǎn)是,若想使用OCI必須要安裝Oracle客戶(hù)端。
安裝完Oracle客戶(hù)端后,里面有個(gè)jdbc的文件夾,該文件夾下就包含了OCI驅(qū)動(dòng)和THIN驅(qū)動(dòng)。所以是不需要去網(wǎng)上下載的。這個(gè)驅(qū)動(dòng)在
jdbc/lib文件夾下,主要有classes12.jar、nls_charset12.jar等等。其中以12結(jié)尾的驅(qū)動(dòng)包適應(yīng)于jdk1.1以上
的版本。以11結(jié)尾的適應(yīng)于jdk1.1以下的版本。文件名中含有classes的jar包就是驅(qū)動(dòng)程序,文件名中含有nls的jar包是與國(guó)際化有關(guān)的
類(lèi)。
找到文件后,就需要把class和nls的jar包的絕對(duì)路徑加入CLASS_PATH環(huán)境變量,否則會(huì)報(bào)ClassNotFound的異常。
設(shè)置環(huán)境變量后,就可以直接使用OCI驅(qū)動(dòng)了。不要被“驅(qū)動(dòng)”兩個(gè)字嚇壞了,驅(qū)動(dòng)就是一個(gè)可執(zhí)行文件和一個(gè)連接字符串。很簡(jiǎn)單,無(wú)非是連接字符串的問(wèn)題。標(biāo)準(zhǔn)的連接字符串如下所示:
[java] view plain copy
Class.forName("oracle.jdbc.driver.OracleDriver");
Connectioncon=DriverManager.getConnection("jdbc:oracle:oci:@xxzc","duansiyuan","oracle_password");
只要這兩行,就可以保證連接到數(shù)據(jù)庫(kù),而這個(gè)數(shù)據(jù)庫(kù)不管是單個(gè)數(shù)據(jù)庫(kù)還是集群數(shù)據(jù)庫(kù)。其中xxzc就是數(shù)據(jù)庫(kù)名,duansiyuan就是用戶(hù)名,oralce_password就是密碼。這種方式和C#中的方式比較類(lèi)似。
需要注意的問(wèn)題:
1、oracle_home/jdbc文件夾下有大量的樣板代碼和幫助文檔,里面對(duì)如何安裝和使用jdbc都有詳細(xì)的說(shuō)明,請(qǐng)引起高度重視并耐心閱讀。里面有很多知識(shí)僅通過(guò)自己反復(fù)的實(shí)踐是無(wú)法獲取的。
2、如果想要高性能,請(qǐng)使用OCI連接,如果不想裝Oracle客戶(hù)端,請(qǐng)使用thin連接。
參考資料
[1] ODBC、OLE DB、ADO的區(qū)別,http://blog.csdn.net/yinjingjing198808/article/details/7665577
[2] ADO與ADO.NET的區(qū)別與介紹,http://www.jb51.net/article/34121.htm
[3] ADO和ADO.NET的區(qū)別,http://blog.csdn.net/luckyzhoustar/article/details/24770423
[4] JDBC和ODBC,http://www.tongji.edu.cn/~yangdy/database/paper6.htm
[5] 使用 ODP.NET 訪(fǎng)問(wèn) Oracle http://www.oracle.com/technetwork/cn/testcontent/o23odp-084525-zhs.html
總結(jié)
以上是生活随笔為你收集整理的连接访问数据库的技术方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Partition学习笔记
- 下一篇: Visual Studio fatal