第10章中間件技術(shù)_第1頁
第10章中間件技術(shù)_第2頁
第10章中間件技術(shù)_第3頁
第10章中間件技術(shù)_第4頁
第10章中間件技術(shù)_第5頁
已閱讀5頁,還剩92頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第10章

中間件技術(shù)

內(nèi)容異構(gòu)數(shù)據(jù)庫與中間件ODBC結(jié)構(gòu)ODBC接口ODBC的符合性級別異構(gòu)數(shù)據(jù)庫網(wǎng)絡(luò)上存在各種截然不同的數(shù)據(jù)庫SQLServerDB2ORACLESYBASE…..ApplicationCONNECTSQLServerORACLEDB2中間件中間件的定義中間件的作用中間件的定義中間件(middleware):是分布式環(huán)境中保證操作系統(tǒng)、通信協(xié)議、數(shù)據(jù)庫等之間進(jìn)行對話、互操作的軟件系統(tǒng)。在C/S環(huán)境中,中間件同時存在于客戶端和服務(wù)器端,負(fù)責(zé)客戶和服務(wù)器間透明的請求和回答交換。中間件允許不同服務(wù)器之間相互通信,如數(shù)據(jù)庫網(wǎng)關(guān)。應(yīng)用開發(fā)者不需關(guān)心特定環(huán)境的低層細(xì)節(jié),通過中間件等訪問數(shù)據(jù)庫,有關(guān)代碼不依賴于某一具體數(shù)據(jù)庫及該數(shù)據(jù)庫所在平臺,所得到的應(yīng)用軟件也易于移植和升級。中間件的作用中間件的作用是保證網(wǎng)絡(luò)中各部件(軟件和硬件)之間透明地連接隱藏網(wǎng)絡(luò)部件的異構(gòu)性,保證不同網(wǎng)絡(luò)、不同DBMS和某些訪問語言的透明性。網(wǎng)絡(luò)透明性:能支持所有類型的網(wǎng)絡(luò)。服務(wù)器透明性:不管服務(wù)器上的DBMS是何種型號(ORACLE、SYBASE、DB2等。語言透明性:客戶機可用任何開發(fā)語言進(jìn)行發(fā)送請求和接受回答,被調(diào)用的功能應(yīng)該像語言那樣也是獨立的。

中間件的分類根據(jù)用途不同,中間件可分為:數(shù)據(jù)訪問中間件,如ODBC,JDBC,OLEDB;遠(yuǎn)程過程調(diào)用(RPC)中間件;分布式事務(wù)處理中間件;對象調(diào)用中間件;面向消息的中間件;等。ODBC結(jié)構(gòu)ODBC概念ODBC的體系結(jié)構(gòu)ODBC的特性網(wǎng)絡(luò)異構(gòu)數(shù)據(jù)庫訪問接口傳統(tǒng)的數(shù)據(jù)庫編程方式“主語言+DML”問題:特定的前端應(yīng)用不能訪問不同數(shù)據(jù)庫服務(wù)器上的數(shù)據(jù)。各廠商的SQL版本不同,使得不同的RDBMS提供的SQL互不兼容。不同廠商的RDBMS在客戶機與數(shù)據(jù)庫服務(wù)器之間使用了不同的通信協(xié)議。公共的、與數(shù)據(jù)庫無關(guān)的應(yīng)用程序設(shè)計接口(API:ApplicationProgrammingInterface)。開發(fā)者提供單一的編程接口,同一個應(yīng)用程序就可以訪問不同的數(shù)據(jù)庫服務(wù)器。網(wǎng)絡(luò)異構(gòu)數(shù)據(jù)庫訪問接口SQL/CLI1989,微軟等四家公司聯(lián)合提出SQLConnectivity訪問接口規(guī)范,定義了一批訪問數(shù)據(jù)庫的函數(shù)1990,SAG(SQLAccessGroup)集團(tuán)接受SQLConnectivity作為其調(diào)用級接口規(guī)范的基礎(chǔ)(CallLevelInterface,CLI),并獲得ANSI,ISO的認(rèn)可,作為SQL92的附件SQL/CLI1992,微軟發(fā)布基于擴(kuò)展的SQL/CLI的工具集ODBCODBC概念最早的ODBC版本1.0是在1993年8月發(fā)布的。2.0版本、3.0版本、3.5版本分別在1994年12月、1995年10月、1996年10月發(fā)布,每一次的發(fā)布都作了一些改進(jìn),著重于速度、對新的OS的兼容性以及對ODBC可訪問的更高級DBS所具有的功能提供支持。ODBC技術(shù)對C/S計算模式的發(fā)展產(chǎn)生了革命性的影響。微軟ODBCV3.0有61個函數(shù),分為10類ODBC函數(shù)類型連接一個數(shù)據(jù)源取得有關(guān)驅(qū)動程序和數(shù)據(jù)源的信息設(shè)置并檢索驅(qū)動程序的屬性設(shè)置并檢索描述字符段準(zhǔn)備SQL請求提交請求檢索結(jié)果及有關(guān)結(jié)果的信息獲得有關(guān)數(shù)據(jù)源系統(tǒng)表的信息結(jié)束一條語句結(jié)束一個連接ODBC原理應(yīng)用程序應(yīng)用程序應(yīng)用程序……SYBASE公共接口API網(wǎng)絡(luò)軟件FoxproSQLServerDB2Oracle圖10.1采用API的應(yīng)用編程ODBC的體系結(jié)構(gòu)ODBC數(shù)據(jù)庫應(yīng)用程序驅(qū)動程序管理器SQLServer驅(qū)動程序Oracle驅(qū)動程序Foxpro驅(qū)動程序Sybase驅(qū)動程序DB2驅(qū)動程序SQLServer數(shù)據(jù)源Oracle數(shù)據(jù)源DB2數(shù)據(jù)源Sybase數(shù)據(jù)源Foxpro數(shù)據(jù)源DBDBDBDBDB圖10.2ODBC的分層體系結(jié)構(gòu)ODBC的體系結(jié)構(gòu)數(shù)據(jù)源:DB驅(qū)動程序與DBS之間連接的命名包含了數(shù)據(jù)庫位置和數(shù)據(jù)庫類型等信息是一種數(shù)據(jù)連接的抽象注冊一個數(shù)據(jù)源:通過ODBC管理器注冊控制面板—系統(tǒng)和安全—管理工具—數(shù)據(jù)源(ODBC)ODBC管理器:管理安裝的ODBC驅(qū)動程序和管理數(shù)據(jù)源根據(jù)數(shù)據(jù)源提供的數(shù)據(jù)庫位置、數(shù)據(jù)庫類型及ODBC驅(qū)動程序等信息,建立起ODBC與具體數(shù)據(jù)庫的聯(lián)系應(yīng)用程序提供數(shù)據(jù)源名給ODBC,ODBC就能建立起與相應(yīng)數(shù)據(jù)庫的連接ODBC的體系結(jié)構(gòu)數(shù)據(jù)源分為以下三類:用戶數(shù)據(jù)源:用戶創(chuàng)建的數(shù)據(jù)源,稱為“用戶數(shù)據(jù)源”。此時只有創(chuàng)建者才能使用,并且只能在所定義的機器上運行。任何用戶都不能使用其他用戶創(chuàng)建的用戶數(shù)據(jù)源。系統(tǒng)數(shù)據(jù)源:系統(tǒng)數(shù)據(jù)源屬于創(chuàng)建它的計算機,而不是創(chuàng)建它的用戶。所有用戶和在WindowsNT下以服務(wù)方式運行的應(yīng)用程序均可使用系統(tǒng)數(shù)據(jù)源。文件數(shù)據(jù)源:文件數(shù)據(jù)源是ODBC3.0以上版本增加的一種數(shù)據(jù)源,可用于企業(yè)用戶,ODBC驅(qū)動程序也安裝在用戶的計算機上共享數(shù)據(jù)庫文件。用戶數(shù)據(jù)源用戶數(shù)據(jù)源用戶數(shù)據(jù)源ODBC的體系結(jié)構(gòu)DB驅(qū)動程序ODBC函數(shù)和數(shù)據(jù)源交互的DLL,提供了ODBC和數(shù)據(jù)庫之間的接口,裝入:應(yīng)用程序調(diào)用SQLConnect或SQLDriverConnect時,驅(qū)動程序管理器裝入相應(yīng)的驅(qū)動程序?qū)碜詰?yīng)用程序的ODBC函數(shù)調(diào)用進(jìn)行應(yīng)答,按照其要求執(zhí)行以下任務(wù):建立應(yīng)用程序與數(shù)據(jù)源的連接;向數(shù)據(jù)源提交用戶請求執(zhí)行的SQL語句;在應(yīng)用程序需求時,轉(zhuǎn)換數(shù)據(jù)格式;把處理結(jié)果返回給應(yīng)用程序;將執(zhí)行過程中DBS返回的錯誤轉(zhuǎn)換成ODBC定義的標(biāo)準(zhǔn)錯誤代碼,并返回給應(yīng)用程序;根據(jù)需要定義和使用光標(biāo)。ODBC的體系結(jié)構(gòu)DB驅(qū)動程序:SQLServer的驅(qū)動數(shù)據(jù)源和DB驅(qū)動程序數(shù)據(jù)源和DB驅(qū)動程序數(shù)據(jù)源和DB驅(qū)動程序數(shù)據(jù)源和DB驅(qū)動程序數(shù)據(jù)源和DB驅(qū)動程序數(shù)據(jù)源和DB驅(qū)動程序數(shù)據(jù)源和DB驅(qū)動程序數(shù)據(jù)源和DB驅(qū)動程序數(shù)據(jù)源和DB驅(qū)動程序ODBC的體系結(jié)構(gòu)DB驅(qū)動程序:兩類單層次(single-tier):這種方式下,驅(qū)動程序要處理ODBC調(diào)用SQL語句,并直接操縱數(shù)據(jù)庫,因此具有數(shù)據(jù)存取功能。最常見的是同一臺微機之上異種數(shù)據(jù)庫通過ODBC存取,如在PowerBuilder中存取Excel、Paradox等數(shù)據(jù)文件ODBC的體系結(jié)構(gòu)工作站ODBC數(shù)據(jù)庫應(yīng)用程序驅(qū)動程序管理器單層驅(qū)動程序(包含DB引擎)數(shù)據(jù)庫文件(*.mdf)網(wǎng)絡(luò)文件服務(wù)器ODBC的體系結(jié)構(gòu)多層驅(qū)動程序:驅(qū)動程序僅處理ODBC調(diào)用將SQL語句交給服務(wù)器執(zhí)行,然后返回結(jié)果往往應(yīng)用程序、驅(qū)動程序管理器、驅(qū)動程序駐留在客戶機端,而數(shù)據(jù)源和數(shù)據(jù)存取功能放在服務(wù)器端FoxPro或PowerBuilder存取SQLServer或Oracle上的數(shù)據(jù)兩者之間加上網(wǎng)關(guān)以解決通信協(xié)議的轉(zhuǎn)換等問題ODBC的體系結(jié)構(gòu)工作站ODBC數(shù)據(jù)庫應(yīng)用程序驅(qū)動程序管理器單層驅(qū)動程序(包含DB引擎)數(shù)據(jù)庫文件(*.DBF)網(wǎng)絡(luò)文件服務(wù)器圖10.3網(wǎng)絡(luò)環(huán)境下基于單層驅(qū)動程序的ODBC結(jié)構(gòu)ODBC的體系結(jié)構(gòu)ODBC數(shù)據(jù)庫應(yīng)用程序

驅(qū)動程序管理器多層驅(qū)動程序

客戶端網(wǎng)絡(luò)支撐軟件

服務(wù)器網(wǎng)絡(luò)支撐軟件數(shù)據(jù)庫引擎數(shù)據(jù)庫文件(*.mdf)DB服務(wù)器(網(wǎng)絡(luò))客戶端SQL請求操作結(jié)果圖10.4基于多層驅(qū)動程序的ODBC結(jié)構(gòu)(兩層結(jié)構(gòu))Web數(shù)據(jù)庫中間件體系結(jié)構(gòu)在web上為解決Web到數(shù)據(jù)庫通信協(xié)議的轉(zhuǎn)換,加入數(shù)據(jù)庫網(wǎng)關(guān)基于通用網(wǎng)關(guān)CGI:CGI:www服務(wù)器外部程序規(guī)范,按照CGI編寫的程序用于擴(kuò)展服務(wù)器的功能。用戶瀏覽器通過HTTP協(xié)議向web服務(wù)器發(fā)出查詢請求Web服務(wù)器按照CGI協(xié)議激活外部程序CGI程序分析html文本,生成查詢要求的SQL語句,連接數(shù)據(jù)庫,將DBMS返回的結(jié)果轉(zhuǎn)化為html文本,發(fā)送給web服務(wù)器Web服務(wù)器將嵌入有查詢結(jié)果的html文本發(fā)送用戶瀏覽器ODBC的體系結(jié)構(gòu)CGI的局限性客戶端與后端數(shù)據(jù)庫服務(wù)器通信必須通過Web服務(wù)器,且Web服務(wù)器要進(jìn)行數(shù)據(jù)與HTML文檔的互相轉(zhuǎn)換,當(dāng)多個用戶同時發(fā)出請求時,必然在Web服務(wù)器形成信息和發(fā)布瓶頸;CGI應(yīng)用程序每次運行都需打開和關(guān)閉數(shù)據(jù)庫連接,效率低,操作費時;CGI應(yīng)用程序不能由多個客戶機請求共享,即使新請求到來時CGI程序正在運行,也會啟動另一個CGI應(yīng)用程序,隨著并行請求的數(shù)量增加,服務(wù)器上將生成越來越多的進(jìn)程。為每個請求都生成進(jìn)程既費時又需要大量內(nèi)存,影響了資源的使用效率,導(dǎo)致性能降低并增加等待時間;由于SQL與HTML差異很大,CGI程序中的轉(zhuǎn)換代碼編寫繁瑣,維護(hù)困難;安全性差,缺少用戶訪問控制,對數(shù)據(jù)庫難以設(shè)置安全訪問權(quán)限;HTTP協(xié)議是無狀態(tài)且沒有常連接的協(xié)議,DBMS事務(wù)的提交與否無法得到驗證,不能構(gòu)造Web上的OLTP(On-LineTransactionProcessing聯(lián)機事務(wù)處理)應(yīng)用。ODBC的體系結(jié)構(gòu)基于擴(kuò)展的web服務(wù)器API作為dll駐留在web服務(wù)器中,功能與CGI類似。與web服務(wù)器結(jié)合緊密,占用資源少各個廠家的API兼容性差,編程復(fù)雜,多線程,同步,直接協(xié)議編程,錯誤處理等ASP(ActiveServerPages)基于組件(com)模型,結(jié)合html腳本可以直接在html文本中包含可執(zhí)行的腳本,html文本和腳本的開發(fā)結(jié)合為一個過程JDBCJava執(zhí)行SQL語句的API,由一系列的類和接口組成(Java.sql包中)通過JDBC,Javaapplet可以直接與數(shù)據(jù)庫連接、查詢ODBC的體系結(jié)構(gòu)客戶端首先訪問Web服務(wù)器,下載Java字節(jié)碼文件,并將Applet相關(guān)類的字節(jié)碼文件和JDBC接口字節(jié)碼文件下栽到客戶端,然后與Web服務(wù)器脫離,接著Applet根據(jù)數(shù)據(jù)庫地址,端口號和帳號與數(shù)據(jù)庫服務(wù)器連接進(jìn)行交互,這樣用戶與數(shù)據(jù)庫服務(wù)器的交互是由瀏覽器直接完成的。Web數(shù)據(jù)庫中間件體系結(jié)構(gòu)數(shù)據(jù)庫應(yīng)用程序

客戶端網(wǎng)絡(luò)支撐軟件

數(shù)據(jù)庫引擎數(shù)據(jù)庫服務(wù)器網(wǎng)絡(luò)支撐軟件數(shù)據(jù)庫網(wǎng)關(guān)驅(qū)動程序管理器驅(qū)動程序圖10.5基于網(wǎng)關(guān)機制的多層驅(qū)動程序的ODBC結(jié)構(gòu)(三層結(jié)構(gòu))客戶瀏覽器(網(wǎng)絡(luò))WWW服務(wù)器數(shù)據(jù)庫服務(wù)器ODBC的體系結(jié)構(gòu)驅(qū)動程序管理器:一個動態(tài)鏈接庫(DLL),ODBC32.DLL用于連接各種DBS的DBMS驅(qū)動程序,管理應(yīng)用程序和DBMS驅(qū)動程序之間的交互作用(通信)。驅(qū)動程序管理器的主要功能如下:為不同驅(qū)動程序的ODBC函數(shù)提供單一的入口;檢查ODBC調(diào)用參數(shù)的合法性和記錄ODBC函數(shù)的調(diào)用;為應(yīng)用程序加載DBMS驅(qū)動程序;調(diào)用正確的DBMS驅(qū)動程序;提供驅(qū)動程序信息。ODBC的體系結(jié)構(gòu)應(yīng)用程序主要完成:連接數(shù)據(jù)庫; 向數(shù)據(jù)源發(fā)送SQL語句;為SQL語句執(zhí)行結(jié)果分配存儲空間;讀取結(jié)果;處理錯誤;

向用戶提交處理結(jié)果;事務(wù)提交和回退操作;斷開與數(shù)據(jù)源的連接。ODBC的特性從ODBC的體系結(jié)構(gòu)可以看出,ODBC技術(shù)有下列三個特性:(1)ODBC是一個調(diào)用層的接口。(2)ODBC定義了標(biāo)準(zhǔn)的SQL語法。(3)ODBC提供一個驅(qū)動程序管理器來管理 并同時訪問多個DBMS系統(tǒng)。ODBC接口ODBC應(yīng)用程序的基本流程ODBC句柄數(shù)據(jù)源的連接與斷開SQL語句的執(zhí)行查詢結(jié)果的獲取應(yīng)用程序的基本流程分配環(huán)境句柄

分配連接句柄

與服務(wù)器連接分配語句句柄

語句處理和檢索

與服務(wù)器斷開釋放語句句柄釋放連接句柄釋放環(huán)境句柄SQLAllocEnvSQLAllocConnectSQLConnectSQLAllocStmtSQLExecDirect(直接執(zhí)行)SQLPrepare(語句預(yù)備)SQLExecute(語句執(zhí)行)SQLDisconnectSQLFreeStmtSQLFreeConnectSQLFreeEnv初始化

SQL處理

終止

圖10.6ODBC應(yīng)用程序的基本流程ODBC句柄

環(huán)境句柄應(yīng)用程序連接句柄連接句柄連接句柄語句句柄語句句柄語句句柄(只有一個)…………圖10.7三種句柄之間的關(guān)系ODBC句柄…………環(huán)境句柄(定義DB應(yīng)用環(huán)境)連接句柄(定義一個DB連接)語句句柄(定義一個SQL語句)□□□henvhdbc

hstmt

圖10.8各種句柄之間的關(guān)系ODBC句柄一個ODBC句柄(Handle):一個應(yīng)用程序變量,用來存儲關(guān)于應(yīng)用程序的上下文信息和應(yīng)用程序所用到的一些對象。ODBC使用三個句柄環(huán)境句柄,一個環(huán)境句柄可以與多個連接句柄相連連接句柄,一個連接句柄可與多個語句句柄相連語句句柄,個應(yīng)用程序只有一個環(huán)境句柄。環(huán)境句柄定義一個數(shù)據(jù)庫環(huán)境, 連接句柄定義一個數(shù)據(jù)庫連接, 語句句柄定義一條SQL語句。對于句柄,有兩個ODBC函數(shù):分配函數(shù)和釋放函數(shù)。ODBC句柄環(huán)境句柄(EnvironmentHandles)

(1)分配環(huán)境句柄函數(shù):SQLAllocEnv(phenv) (2)釋放環(huán)境句柄函數(shù):SQLFreeEnv(henv)連接句柄(ConnectionHandles) (1)分配連接句柄函數(shù):SQLAllocConnect(henv,phdbc)

(2)釋放連接句柄函數(shù):SQLFreeConnect(hdbc)語句句柄(StatementsHandles) (1)分配語句句柄函數(shù):SQLAllocStmt(hdbc,phstmt) (2)釋放語句句柄函數(shù):SQLFreeStmt(hstmt,fOption)

數(shù)據(jù)源的連接與斷開(1)連接數(shù)據(jù)源的函數(shù)

SQLConnect(hdbc,szDSN,cbDSN,szUID,cbUID,szAuthStr,cbAuthStr)。 參數(shù)hdbc是一個已經(jīng)分配的連接分配; 參數(shù)szDSN和cbDSN分別表示系統(tǒng)所要連接的數(shù)據(jù)源 名稱及其長度; 參數(shù)szUID和cbUID分別表示用戶標(biāo)識符及其長度; 參數(shù)szAuthStr和cbAuthStr分別表示權(quán)限字符串 及其長度。(2)斷開數(shù)據(jù)源函數(shù)

SQLDisconnect(hdbc)參數(shù)hdbc是要斷開的連接句柄。

SQL語句的執(zhí)行1.直接執(zhí)行SQL語句的函數(shù)SQLExecDirect(hstmt,szSqlStr,cbSqlStr)其中,參數(shù)hstmt是一個有效的語句句柄; 參數(shù)szSqlStr和cbSqlStr分別表示將要執(zhí)行 的SQL語句的字符串及其長度。例如,要以直接執(zhí)行的方法列出學(xué)生表中的信息,調(diào)用該函數(shù)的格式是:retcode=SQLExecDirect(hstmt,“SELECT*FROMS”,SQL_NTS)SQL語句的執(zhí)行main(){HENV henv; /*說明henv是一個環(huán)境型變量*/HDBC hdbc; /*說明hdbc是一個連接型變量*/HSTMT hstmt /*說明hstmt是一個語句句柄變量*/RETCODE retcode; /*說明retcode是一個返回變量*/SQLAllocEnv(&henv); /*分配一個環(huán)境句柄*/SQLAllocConnect(henv,&hdbc);/*分配一個連接句柄*/SQLConnect(hdbc,“學(xué)生”,SQL_NTS,NULL,0,NULL,0); /*連接數(shù)據(jù)源*/SQLAllocStmt(hdbc,&hstmt); /*分配一個語句句柄*/retcode=SQLExecDirect(hstmt,“SELECT*FROMS”,SQL_NTS); /*執(zhí)行語句*/

……

/*結(jié)果集處理*/SQLDisconnect(hdbc); /*斷開數(shù)據(jù)源*/SQLFreeStmt(hstmt,SQL_DROP)/*釋放一個語句句柄*/SQLFreeConnect(hdbc); /*釋放一個連接句柄*/SQLFreeEnv(henv); /*當(dāng)應(yīng)用完成后,釋放環(huán)境句柄*/}SQL語句的執(zhí)行2.有準(zhǔn)備地執(zhí)行SQL語句的函數(shù)(1)SQL語句預(yù)備函數(shù)

SQLPrepare(hstmt,szSqlStr,cbSqlStr)

其中,參數(shù)hstmt是一個有效的語句句柄,參數(shù)szSqlStr和cbSqlStr分別表示將要執(zhí)行的SQL語句的字符串及其長度。(2)SQL語句執(zhí)行函數(shù)

SQLExecute(hstmt) 其中參數(shù)hstmt是一個有效的語句句柄。查詢結(jié)果的獲?。?)移動光標(biāo)函數(shù) SQLFetch(hstmt)該函數(shù)的功能是把光標(biāo)移到下一行。(2)讀光標(biāo)指向行中一列值的函數(shù)SQLGetData(hstmt,icol,fCType, rgbValue,cbValueMax,pcbValue)查詢結(jié)果的獲取例10.2在例10.1程序的中間省略部分“……”插入下面一段語句,執(zhí)行讀查詢結(jié)果集中的數(shù)據(jù)。while(RETCODE_IS_SUCCESSFUL(retcode)){retcode=SQLFetch(hstmt);if(RETCODE_IS_SUCCESSFUL(retcode){do{rcGetData=SQLGetData(hstmt,1, SQL_C_CHAR,szBuffer, sizeof(szBuffer),&cbValue); DISPLAY_MEMO(szBuffer,cbValue);/*顯示*/ }while(rcGetData!=SQL_NO_DATA_FOUND);}}ODBC的符合性級別API符合性的三個級別SQL符合性的三個級別ODBCAPI與SQLCLI之間的協(xié)調(diào)SQLCLI與嵌入式SQL的比較SQLCLI的應(yīng)用ODBC的符合性級別ODBC問題:有的SQL功能在某廠商的DBMS上沒有實現(xiàn),則ODBC就不可能為應(yīng)用程序完成這一功能;有的SQL功能是SQL標(biāo)準(zhǔn)新增加的,而DBMS廠商沒有及時跟上,則ODBC同樣也無法完成新功能。對于具體DBMS不支持的SQL功能,DBMS要通報給應(yīng)用程序。從ODBC本身來講,它最好支持完全的SQL,這樣才能做到應(yīng)用程序不用修改就可以訪問不同的數(shù)據(jù)源。API符合性的三個級別

1.核心級API 核心級API有22個函數(shù),包括了完成一個數(shù)據(jù)庫應(yīng)用程序所要做的所有必備的工作。2.1級API 1級API除包括核心級API22個函數(shù)外,還包括16個附加函數(shù)。3.2級API 2級API除包括核心級API22個函數(shù)和1級API16個函數(shù)外,還包括17個附加函數(shù)。SQL符合性的三個級別

SQL符合性級別不是對編程的限制,應(yīng)用程序可以自由地使用各種SQL語句,如果DBMS不支持,則驅(qū)動程序會報告。SQL符合性級別有:最小級SQL,核心級SQL,擴(kuò)展級SQL。ODBC定義了這三個級別的SQL語法兼容性,每一后繼級別都建立在較低級別的基礎(chǔ)上,它包括前一級別所支持的SQL語句,也增加了一些語句。ODBCAPI與SQLCLI 之間的協(xié)調(diào)MS公司于1991年11月提出了一個關(guān)于ODBC的體系結(jié)構(gòu),并在1992年發(fā)布了ODBC1.0規(guī)范,隨后以SDK形式出版并發(fā)行了這種面向SQL的API。數(shù)據(jù)庫公司國際財團(tuán)SQLAccessGroup(SAG)和標(biāo)準(zhǔn)化組織X/Open在1992年聯(lián)合出版了一個規(guī)范,該規(guī)范定義了調(diào)用級界面(CallLevelInterface,CLI)標(biāo)準(zhǔn)。1993年,MS公司推出了ODBC2.0規(guī)范,并于1994年出版了ODBC2.0SDK。MS在1998年出版的ODBC3.0規(guī)范中,作了一些修改,目的是更進(jìn)一步接近SQL標(biāo)準(zhǔn)。SQL3(即SQL99)的第三部分介紹了SQL/CLI。

ODBCAPI與SQLCLI 之間的協(xié)調(diào)在ODBC3.0版本和SQL/CLI中,都建議用戶:廢棄三個分配函數(shù)SQLAllocEnv、SQLAllocConnect和SQLAllocStmt, 而只使用一個函數(shù)SQLAllocHandle,廢棄三個釋放函數(shù)SQLFreeEnv、SQLFreeConnect和SQLFreeStmt, 而只使用一個函數(shù)SQLFreeHandle。SQLCLI與嵌入式SQL 的比較與嵌入式SQL相比,SQLCLI有下列四個優(yōu)點:(1)標(biāo)準(zhǔn)化、通用化。將數(shù)據(jù)源的差異屏蔽在驅(qū)動程序?qū)崿F(xiàn)之中,改善了應(yīng)用程序的可移植性。(2)能支持應(yīng)用程序并發(fā)訪問不同數(shù)據(jù)源或同一數(shù)據(jù)源。對于不同的訪問有不同的連接句柄,彼此不會干擾。(3)免除了預(yù)編譯步驟,省去了說明游標(biāo)和操作游標(biāo)的語句,不需要說明主變量,應(yīng)用程序中任何變量都可以和數(shù)據(jù)源交換數(shù)據(jù)。(4)對訪問數(shù)據(jù)源的每一步驟,在執(zhí)行時都提供相應(yīng)的診斷信息,便于調(diào)試;而在嵌入式SQL中,只有在訪問結(jié)束時才提供診斷信息。SQLCLI與嵌入式SQL 的比較在嵌入式SQL中,SQL函數(shù)是編譯執(zhí)行,比起從DLL動態(tài)調(diào)用執(zhí)行,性能要好。但對于訪問多數(shù)據(jù)源或數(shù)據(jù)源變化大的應(yīng)用程序,選用SQLCLI無疑是上策。SQLCLI為應(yīng)用程序訪問數(shù)據(jù)源提供了一個標(biāo)準(zhǔn)接口,目前已為工業(yè)界和用戶廣泛接受。在20世紀(jì)90年代,為了比較系統(tǒng)地解決分布異構(gòu)環(huán)境下的計算、互操作、互訪問等系統(tǒng)集成問題,相繼出現(xiàn)了以對象為基礎(chǔ)的分布對象計算模型,其中著名的有COM/DCOM(ComponentObjectModel/DistributedCOM),CORBA(CommonObjectRequestBrokerArchitecture)和JavaBeans。這三個模型已在工業(yè)界流行,并且成為工業(yè)標(biāo)準(zhǔn)或事實上的工業(yè)標(biāo)準(zhǔn),可望逐步發(fā)展成為國際標(biāo)準(zhǔn)。SQL/CLI的應(yīng)用API是微軟公司ODBC技術(shù)的術(shù)語,是非SQL名稱。在SQL標(biāo)準(zhǔn)中,稱為“調(diào)用層接口”(CallLevelInterface,簡記為CLI)。SQL/CLI是ODBC技術(shù)的延續(xù)。下面介紹SQL/CLI的使用,用C語言作為宿主語言。CLI定義了一套可以從宿主語言調(diào)用的公共函數(shù),每一個函數(shù)具有一個名稱和一個要求的算法(當(dāng)使用這個函數(shù)調(diào)用時,DBMS應(yīng)該做什么)。在SQL3的第三部分介紹了SQL/CLI。SQL/CLI的應(yīng)用使用SQL/CLI時,有必要將宿主程序與數(shù)據(jù)庫交互的有關(guān)信息記錄在運行時數(shù)據(jù)結(jié)果中。此信息保存在以下四種類型的記錄中,表示為C數(shù)據(jù)類型中的復(fù)合結(jié)構(gòu)(Struct):●環(huán)境記錄(EnvironmentRecord):用作為一個容器,設(shè)置環(huán)境信息,以保存一個或多個數(shù)據(jù)庫連接?!襁B接記錄(ConnectionRecord):保存一個特定數(shù)據(jù)庫連接所需的信息,表示應(yīng)用系統(tǒng)與數(shù)據(jù)源之間的連接?!裾Z句記錄(StatementRecord):保存一個SQL語句所需的信息?!衩枋鲇涗?DescriptionRecord):保存元組或參數(shù)的有關(guān)信息,如元組中的屬性個數(shù)及其類型,或某個函數(shù)調(diào)用中的參數(shù)個數(shù)及其類型。SQL/CLI的應(yīng)用若要創(chuàng)建記錄,需要使用如下SQL/CLI函數(shù):

SQLAllocHandle(<handle_type>,<handle_1>, <handle_2>)函數(shù)中參數(shù)的含義如下:<handle_type>指示所創(chuàng)建記錄的類型。此參數(shù)可能的 值為關(guān)鍵字SQL_HANDLE_ENV、 SQL_HANDLE_DBC、SQL_HANDLE_STMT、 SQL_HANDLE_DESC。<handle_1>指示了新句柄在哪個容器中創(chuàng)建。<handle_2>是指向新創(chuàng)建的<handle_type>類型記錄的 指針(句柄)。SQL/CLI的應(yīng)用例10.3下面的程序段是讀?。ㄝ斎耄┠硨W(xué)生的學(xué)號,然后查詢關(guān)系S,并打印該學(xué)生的姓名和年齡。

0)#includesqlcli.h; 1)voidprintAge(){ 2)SQLHSTMTstmt1; 3)SQLHDBCcon1; 4)SQLHENVenv1; 5)SQLRETURNret1,ret2,ret3,ret4; 6)ret1=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,&env1); 7)if(!ret1)ret2=SQLAllocHandle( SQL_HANDLE_DBC,env1,&con1)elseexit;SQL/CLI的應(yīng)用 8)if(!ret2)ret3=SQLConnect(con1,〞dbs〞, SQL_NTS,〞js〞,SQL_NTS, 〞xyz〞,SQL_NTS)elseexit;9)if(!ret3)ret4=SQLAllocHandle( SQL_HANDLE_STMT,con1,&stmt1)elseexit; 10)SQLPrepare(stmt1,〞selectSNAME,AGEfromS whereS#=?〞,SQL_NTS); 11)prompt(〞EnteraStudentNumber:〞,s#); 12)SQLBindParameter(stmt1,1,SQL_CHAR,&s#,5, &fetchlen1); 13)ret1=SQLExecute(stmt1);SQL/CLI的應(yīng)用

14)if(!ret1){ 15) SQLBindCol(stmt1,1,SQL_CHAR,&sname, 9,&fetchlen1); 16) SQLBindCol(stmt1,2,SQL_SMALLINT,&age, 2,&fetchlen2); 17) ret2=SQLFetch(stmt1); 18) if(!ret2)printf(s#,sname,age); 19) elseprintf(〞TheStudentNumberdosnot exist: 〞,s#); 20) } 21)}SQL/CLI的應(yīng)用例10.4下面的程序段先讀?。ㄝ斎耄┮粋€年齡值,然后檢索符合這個年齡的學(xué)生。接著用一個循環(huán)處理各個學(xué)生記錄,并打印各學(xué)生的姓名和性別。

0)#includesqlcli.h; 1)voidprintAgeStudents(){ 2)SQLHSTMTstmt1; 3)SQLHDBCcon1; 4)SQLHENVenv1; 5)SQLRETURNret1,ret2,ret3,ret4; 6)ret1=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,&env1); 7)if(!ret1)ret2=SQLAllocHandle( SQL_HANDLE_DBC,env1,&con1)elseexit;SQL/CLI的應(yīng)用

8)if(!ret2)ret3=SQLConnect(con1,〞dbs〞, SQL_NTS,〞js〞,SQL_NTS, 〞xyz〞,SQL_NTS)elseexit; 9)if(!ret3)ret4=SQLAllocHandle( SQL_HANDLE_STMT,con1,&stmt1)elseexit; 10)SQLPrepare(stmt1,〞selectSNAME,SEXfromS whereAGE=?〞,SQL_NTS); 11)prompt(〞EnteraAge:〞,age); 12)SQLBindParameter(stmt1,1,SQL_SMALLINT, &age,2,&fetchlen1); 13)ret1=SQLExecute(stmt1);SQL/CLI的應(yīng)用

14)if(!ret1){ 15) SQLBindCol(stmt1,1,SQL_CHAR,&sname, 9,&fetchlen1); 16) SQLBindCol(stmt1,2,SQL_CHAR,&SEX, 2,&fetchlen2); 17) ret2=SQLFetch(stmt1); 18) while(!ret2){19) printf(sname,sex); 20) ret2=SQLFetch(stmt1); 21) } 22) } 23)}JDBCJDBC簡介JDBC驅(qū)動類型JDBCAPIJDBC的發(fā)展JDBC簡介Java于1995年5月正式公布,數(shù)據(jù)庫應(yīng)用程序中,沒有一個Java語言的API,編程人員不得不在Java程序中加入C語言的ODBC函數(shù)調(diào)用。很多Java的優(yōu)秀特性無法充分發(fā)揮平臺無關(guān)性面向?qū)ο筇匦訨DBC是為在JavaApplet和應(yīng)用程序中訪問關(guān)系數(shù)據(jù)庫而設(shè)計的API類。JDBC獨立于平臺和數(shù)據(jù)庫。在JDBC規(guī)范中,提供了SQL數(shù)據(jù)庫訪問的JAVA方法。JDBC應(yīng)用框架JDBC兩層模型JDBC三層模型JDBC與ODBCODBCAPI是C的庫函數(shù),在JAVA程序中不能直接使用。非面型對象大量指針因為語言本身的差異,不能將ODBCCAPI逐字翻譯為JAVAAPI。使用JDBC使應(yīng)用程序保持“純JAVA”的可移植性等。JDBC驅(qū)動類型Java應(yīng)用程序JDBC驅(qū)動管理器JDBC網(wǎng)絡(luò)驅(qū)動JDBC-ODBC橋ODBC和數(shù)據(jù)庫驅(qū)動數(shù)據(jù)庫驅(qū)動A數(shù)據(jù)庫驅(qū)動B專用數(shù)據(jù)庫協(xié)議JDBC中間協(xié)議JDBCAPIJDBC驅(qū)動APIJDBC實現(xiàn)JDBC驅(qū)動類型JDBC-ODBC橋(JDBC-ODBCbridge)JDBC調(diào)用ODBCLibaryODBCDriverDatabase

。要求ODBC代碼、client端代碼都要在客戶機上安裝適合企業(yè)網(wǎng),但由于效率較低不適合大量數(shù)據(jù)訪問的應(yīng)用,也不適合Internet應(yīng)用,因為不能要求所有客戶都安裝ODBC。問題:Java應(yīng)用程序具有平臺相關(guān)性,安全性降低,可移植性差。JDBC驅(qū)動類型本地API驅(qū)動:把客戶機API上的JDBC調(diào)用轉(zhuǎn)換為Oracle、Sybase、DB2等DBMS本地API調(diào)用執(zhí)行效率高于JDBC-ODBC橋JDBC調(diào)用數(shù)據(jù)庫的Client端API,也需要在客戶機上安裝代碼。不適合InternetJDBC驅(qū)動類型網(wǎng)絡(luò)協(xié)議完全JAVA驅(qū)動:Application>JdbcDriver>javamiddleware>JDBCDriver>Databasejdbc先把對數(shù)局庫的訪問請求傳遞給網(wǎng)絡(luò)上的中間件服務(wù)器中間件服務(wù)器再把請求翻譯為符合數(shù)據(jù)庫規(guī)范的調(diào)用,再把這種調(diào)用傳給數(shù)據(jù)庫服務(wù)器果中間件服務(wù)器也是用java開發(fā)的,那么在在中間層也可以使用1,2型jdbc驅(qū)動JDBC驅(qū)動類型網(wǎng)絡(luò)協(xié)議完全JAVA驅(qū)動:驅(qū)動是基于server的,不需要在客戶端加載數(shù)據(jù)庫廠商提供的代碼庫,可以設(shè)計的很小,多了一個中間層傳遞數(shù)據(jù),它的執(zhí)行效率還不是最好JDBC驅(qū)動類型本地協(xié)議完全JAVA驅(qū)動JDBC調(diào)用直接轉(zhuǎn)換為DBMS所使用的網(wǎng)絡(luò)協(xié)議的請求Application>Jdbc>databaseengine>database驅(qū)動完全由java實現(xiàn),實現(xiàn)了平臺獨立性效率最高適合Internet上單一數(shù)據(jù)庫的工作組情形JDBCAPI功能建立與數(shù)據(jù)庫的連接發(fā)送SQL語句處理結(jié)果JDBCAPI類類型 JDBC類驅(qū)動程序管理Java.sql.Driverjava.sql.DriverManagerjava.sql.DrivePropertyInfo數(shù)據(jù)庫連接Java.sql.ConnectionSQL語句java.sql.Statementjava.sql.PreparedStatementjava.sql.CallableStatement數(shù)據(jù)java.sql.ResultSet錯誤java.sql.SQLExceptionjava.sql.SQLWarningJDBC類層次驅(qū)動程序管理器連接連接連接語句語句可調(diào)用語句準(zhǔn)備語句executeUpdate()executeQuery()execute()getMoreResults()結(jié)果組元數(shù)據(jù)

數(shù)據(jù)getResultsSet()……建立與數(shù)據(jù)庫的連接驅(qū)動程序管理Java.sql.Driver:每個數(shù)據(jù)庫驅(qū)動程序類都要實現(xiàn)的接口Java.Sql.DriverPropertyInfo:驅(qū)動程序和連接建立需要的特性Java.sql.DriverManager:提供驅(qū)動程序需要的服務(wù),包括加載驅(qū)動程序,驅(qū)動相應(yīng)驅(qū)動程序建立連接等從系統(tǒng)屬性java.sql中讀取Driver的類名,并一一注冊。在程序中使用Class.forName()方法動態(tài)裝載并注冊DriverDriverManager.getConnection()與數(shù)據(jù)庫建立連接傳送SQL語句在數(shù)據(jù)庫連接上創(chuàng)建Statement對象,將各種SQL語句發(fā)送到所連接的數(shù)據(jù)庫。Statementstmt=con.createStatement();ResultSetrs=stmt.executeQuery(“SELECTa,b,cFROMTable1”);對于多次執(zhí)行但參數(shù)不同的SQL語句,可以使用PreparedStatement對象。使用CallableStatement對象調(diào)用數(shù)據(jù)庫上的存儲過程。處理結(jié)果集結(jié)果集是查詢語句返回的數(shù)據(jù)庫記錄的集合。在結(jié)果集中通過游標(biāo)(Cursor)控制具體記錄的訪問。SQL數(shù)據(jù)類型與JAVA數(shù)據(jù)類型的轉(zhuǎn)換根據(jù)SQL數(shù)據(jù)類型的不同,使用不同的方法讀取數(shù)據(jù)。/*處理結(jié)果集rs*/while(rs.next()){

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論