版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章
中間件技術(shù)
內(nèi)容異構(gòu)數(shù)據(jù)庫(kù)與中間件ODBC結(jié)構(gòu)ODBC接口ODBC的符合性級(jí)別異構(gòu)數(shù)據(jù)庫(kù)網(wǎng)絡(luò)上存在各種截然不同的數(shù)據(jù)庫(kù)SQLServerDB2ORACLESYBASE…..ApplicationCONNECTSQLServerORACLEDB2中間件中間件的定義中間件的作用中間件的定義中間件(middleware):是分布式環(huán)境中保證操作系統(tǒng)、通信協(xié)議、數(shù)據(jù)庫(kù)等之間進(jìn)行對(duì)話、互操作的軟件系統(tǒng)。在C/S環(huán)境中,中間件同時(shí)存在于客戶端和服務(wù)器端,負(fù)責(zé)客戶和服務(wù)器間透明的請(qǐng)求和回答交換。中間件允許不同服務(wù)器之間相互通信,如數(shù)據(jù)庫(kù)網(wǎng)關(guān)。應(yīng)用開發(fā)者不需關(guān)心特定環(huán)境的低層細(xì)節(jié),通過(guò)中間件等訪問(wèn)數(shù)據(jù)庫(kù),有關(guān)代碼不依賴于某一具體數(shù)據(jù)庫(kù)及該數(shù)據(jù)庫(kù)所在平臺(tái),所得到的應(yīng)用軟件也易于移植和升級(jí)。中間件的作用中間件的作用是保證網(wǎng)絡(luò)中各部件(軟件和硬件)之間透明地連接隱藏網(wǎng)絡(luò)部件的異構(gòu)性,保證不同網(wǎng)絡(luò)、不同DBMS和某些訪問(wèn)語(yǔ)言的透明性。網(wǎng)絡(luò)透明性:能支持所有類型的網(wǎng)絡(luò)。服務(wù)器透明性:不管服務(wù)器上的DBMS是何種型號(hào)(ORACLE、SYBASE、DB2等。語(yǔ)言透明性:客戶機(jī)可用任何開發(fā)語(yǔ)言進(jìn)行發(fā)送請(qǐng)求和接受回答,被調(diào)用的功能應(yīng)該像語(yǔ)言那樣也是獨(dú)立的。
中間件的分類根據(jù)用途不同,中間件可分為:數(shù)據(jù)訪問(wèn)中間件,如ODBC,JDBC,OLEDB;遠(yuǎn)程過(guò)程調(diào)用(RPC)中間件;分布式事務(wù)處理中間件;對(duì)象調(diào)用中間件;面向消息的中間件;等。ODBC結(jié)構(gòu)ODBC概念ODBC的體系結(jié)構(gòu)ODBC的特性網(wǎng)絡(luò)異構(gòu)數(shù)據(jù)庫(kù)訪問(wèn)接口傳統(tǒng)的數(shù)據(jù)庫(kù)編程方式“主語(yǔ)言+DML”問(wèn)題:特定的前端應(yīng)用不能訪問(wèn)不同數(shù)據(jù)庫(kù)服務(wù)器上的數(shù)據(jù)。各廠商的SQL版本不同,使得不同的RDBMS提供的SQL互不兼容。不同廠商的RDBMS在客戶機(jī)與數(shù)據(jù)庫(kù)服務(wù)器之間使用了不同的通信協(xié)議。公共的、與數(shù)據(jù)庫(kù)無(wú)關(guān)的應(yīng)用程序設(shè)計(jì)接口(API:ApplicationProgrammingInterface)。開發(fā)者提供單一的編程接口,同一個(gè)應(yīng)用程序就可以訪問(wèn)不同的數(shù)據(jù)庫(kù)服務(wù)器。網(wǎng)絡(luò)異構(gòu)數(shù)據(jù)庫(kù)訪問(wèn)接口SQL/CLI1989,微軟等四家公司聯(lián)合提出SQLConnectivity訪問(wèn)接口規(guī)范,定義了一批訪問(wèn)數(shù)據(jù)庫(kù)的函數(shù)1990,SAG(SQLAccessGroup)集團(tuán)接受SQLConnectivity作為其調(diào)用級(jí)接口規(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),著重于速度、對(duì)新的OS的兼容性以及對(duì)ODBC可訪問(wèn)的更高級(jí)DBS所具有的功能提供支持。ODBC技術(shù)對(duì)C/S計(jì)算模式的發(fā)展產(chǎn)生了革命性的影響。微軟ODBCV3.0有61個(gè)函數(shù),分為10類ODBC函數(shù)類型連接一個(gè)數(shù)據(jù)源取得有關(guān)驅(qū)動(dòng)程序和數(shù)據(jù)源的信息設(shè)置并檢索驅(qū)動(dòng)程序的屬性設(shè)置并檢索描述字符段準(zhǔn)備SQL請(qǐng)求提交請(qǐng)求檢索結(jié)果及有關(guān)結(jié)果的信息獲得有關(guān)數(shù)據(jù)源系統(tǒng)表的信息結(jié)束一條語(yǔ)句結(jié)束一個(gè)連接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ù)庫(kù)應(yīng)用程序驅(qū)動(dòng)程序管理器SQLServer驅(qū)動(dòng)程序Oracle驅(qū)動(dòng)程序Foxpro驅(qū)動(dòng)程序Sybase驅(qū)動(dòng)程序DB2驅(qū)動(dòng)程序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ū)動(dòng)程序與DBS之間連接的命名包含了數(shù)據(jù)庫(kù)位置和數(shù)據(jù)庫(kù)類型等信息是一種數(shù)據(jù)連接的抽象注冊(cè)一個(gè)數(shù)據(jù)源:通過(guò)ODBC管理器注冊(cè)控制面板—系統(tǒng)和安全—管理工具—數(shù)據(jù)源(ODBC)ODBC管理器:管理安裝的ODBC驅(qū)動(dòng)程序和管理數(shù)據(jù)源根據(jù)數(shù)據(jù)源提供的數(shù)據(jù)庫(kù)位置、數(shù)據(jù)庫(kù)類型及ODBC驅(qū)動(dòng)程序等信息,建立起ODBC與具體數(shù)據(jù)庫(kù)的聯(lián)系應(yīng)用程序提供數(shù)據(jù)源名給ODBC,ODBC就能建立起與相應(yīng)數(shù)據(jù)庫(kù)的連接ODBC的體系結(jié)構(gòu)數(shù)據(jù)源分為以下三類:用戶數(shù)據(jù)源:用戶創(chuàng)建的數(shù)據(jù)源,稱為“用戶數(shù)據(jù)源”。此時(shí)只有創(chuàng)建者才能使用,并且只能在所定義的機(jī)器上運(yùn)行。任何用戶都不能使用其他用戶創(chuàng)建的用戶數(shù)據(jù)源。系統(tǒng)數(shù)據(jù)源:系統(tǒng)數(shù)據(jù)源屬于創(chuàng)建它的計(jì)算機(jī),而不是創(chuàng)建它的用戶。所有用戶和在WindowsNT下以服務(wù)方式運(yùn)行的應(yīng)用程序均可使用系統(tǒng)數(shù)據(jù)源。文件數(shù)據(jù)源:文件數(shù)據(jù)源是ODBC3.0以上版本增加的一種數(shù)據(jù)源,可用于企業(yè)用戶,ODBC驅(qū)動(dòng)程序也安裝在用戶的計(jì)算機(jī)上共享數(shù)據(jù)庫(kù)文件。用戶數(shù)據(jù)源用戶數(shù)據(jù)源用戶數(shù)據(jù)源ODBC的體系結(jié)構(gòu)DB驅(qū)動(dòng)程序ODBC函數(shù)和數(shù)據(jù)源交互的DLL,提供了ODBC和數(shù)據(jù)庫(kù)之間的接口,裝入:應(yīng)用程序調(diào)用SQLConnect或SQLDriverConnect時(shí),驅(qū)動(dòng)程序管理器裝入相應(yīng)的驅(qū)動(dòng)程序?qū)?lái)自應(yīng)用程序的ODBC函數(shù)調(diào)用進(jìn)行應(yīng)答,按照其要求執(zhí)行以下任務(wù):建立應(yīng)用程序與數(shù)據(jù)源的連接;向數(shù)據(jù)源提交用戶請(qǐng)求執(zhí)行的SQL語(yǔ)句;在應(yīng)用程序需求時(shí),轉(zhuǎn)換數(shù)據(jù)格式;把處理結(jié)果返回給應(yīng)用程序;將執(zhí)行過(guò)程中DBS返回的錯(cuò)誤轉(zhuǎn)換成ODBC定義的標(biāo)準(zhǔn)錯(cuò)誤代碼,并返回給應(yīng)用程序;根據(jù)需要定義和使用光標(biāo)。ODBC的體系結(jié)構(gòu)DB驅(qū)動(dòng)程序:SQLServer的驅(qū)動(dòng)數(shù)據(jù)源和DB驅(qū)動(dòng)程序數(shù)據(jù)源和DB驅(qū)動(dòng)程序數(shù)據(jù)源和DB驅(qū)動(dòng)程序數(shù)據(jù)源和DB驅(qū)動(dòng)程序數(shù)據(jù)源和DB驅(qū)動(dòng)程序數(shù)據(jù)源和DB驅(qū)動(dòng)程序數(shù)據(jù)源和DB驅(qū)動(dòng)程序數(shù)據(jù)源和DB驅(qū)動(dòng)程序數(shù)據(jù)源和DB驅(qū)動(dòng)程序ODBC的體系結(jié)構(gòu)DB驅(qū)動(dòng)程序:兩類單層次(single-tier):這種方式下,驅(qū)動(dòng)程序要處理ODBC調(diào)用SQL語(yǔ)句,并直接操縱數(shù)據(jù)庫(kù),因此具有數(shù)據(jù)存取功能。最常見(jiàn)的是同一臺(tái)微機(jī)之上異種數(shù)據(jù)庫(kù)通過(guò)ODBC存取,如在PowerBuilder中存取Excel、Paradox等數(shù)據(jù)文件ODBC的體系結(jié)構(gòu)工作站ODBC數(shù)據(jù)庫(kù)應(yīng)用程序驅(qū)動(dòng)程序管理器單層驅(qū)動(dòng)程序(包含DB引擎)數(shù)據(jù)庫(kù)文件(*.mdf)網(wǎng)絡(luò)文件服務(wù)器ODBC的體系結(jié)構(gòu)多層驅(qū)動(dòng)程序:驅(qū)動(dòng)程序僅處理ODBC調(diào)用將SQL語(yǔ)句交給服務(wù)器執(zhí)行,然后返回結(jié)果往往應(yīng)用程序、驅(qū)動(dòng)程序管理器、驅(qū)動(dòng)程序駐留在客戶機(jī)端,而數(shù)據(jù)源和數(shù)據(jù)存取功能放在服務(wù)器端FoxPro或PowerBuilder存取SQLServer或Oracle上的數(shù)據(jù)兩者之間加上網(wǎng)關(guān)以解決通信協(xié)議的轉(zhuǎn)換等問(wèn)題ODBC的體系結(jié)構(gòu)工作站ODBC數(shù)據(jù)庫(kù)應(yīng)用程序驅(qū)動(dòng)程序管理器單層驅(qū)動(dòng)程序(包含DB引擎)數(shù)據(jù)庫(kù)文件(*.DBF)網(wǎng)絡(luò)文件服務(wù)器圖10.3網(wǎng)絡(luò)環(huán)境下基于單層驅(qū)動(dòng)程序的ODBC結(jié)構(gòu)ODBC的體系結(jié)構(gòu)ODBC數(shù)據(jù)庫(kù)應(yīng)用程序
驅(qū)動(dòng)程序管理器多層驅(qū)動(dòng)程序
客戶端網(wǎng)絡(luò)支撐軟件
服務(wù)器網(wǎng)絡(luò)支撐軟件數(shù)據(jù)庫(kù)引擎數(shù)據(jù)庫(kù)文件(*.mdf)DB服務(wù)器(網(wǎng)絡(luò))客戶端SQL請(qǐng)求操作結(jié)果圖10.4基于多層驅(qū)動(dòng)程序的ODBC結(jié)構(gòu)(兩層結(jié)構(gòu))Web數(shù)據(jù)庫(kù)中間件體系結(jié)構(gòu)在web上為解決Web到數(shù)據(jù)庫(kù)通信協(xié)議的轉(zhuǎn)換,加入數(shù)據(jù)庫(kù)網(wǎng)關(guān)基于通用網(wǎng)關(guān)CGI:CGI:www服務(wù)器外部程序規(guī)范,按照CGI編寫的程序用于擴(kuò)展服務(wù)器的功能。用戶瀏覽器通過(guò)HTTP協(xié)議向web服務(wù)器發(fā)出查詢請(qǐng)求Web服務(wù)器按照CGI協(xié)議激活外部程序CGI程序分析html文本,生成查詢要求的SQL語(yǔ)句,連接數(shù)據(jù)庫(kù),將DBMS返回的結(jié)果轉(zhuǎn)化為html文本,發(fā)送給web服務(wù)器Web服務(wù)器將嵌入有查詢結(jié)果的html文本發(fā)送用戶瀏覽器ODBC的體系結(jié)構(gòu)CGI的局限性客戶端與后端數(shù)據(jù)庫(kù)服務(wù)器通信必須通過(guò)Web服務(wù)器,且Web服務(wù)器要進(jìn)行數(shù)據(jù)與HTML文檔的互相轉(zhuǎn)換,當(dāng)多個(gè)用戶同時(shí)發(fā)出請(qǐng)求時(shí),必然在Web服務(wù)器形成信息和發(fā)布瓶頸;CGI應(yīng)用程序每次運(yùn)行都需打開和關(guān)閉數(shù)據(jù)庫(kù)連接,效率低,操作費(fèi)時(shí);CGI應(yīng)用程序不能由多個(gè)客戶機(jī)請(qǐng)求共享,即使新請(qǐng)求到來(lái)時(shí)CGI程序正在運(yùn)行,也會(huì)啟動(dòng)另一個(gè)CGI應(yīng)用程序,隨著并行請(qǐng)求的數(shù)量增加,服務(wù)器上將生成越來(lái)越多的進(jìn)程。為每個(gè)請(qǐng)求都生成進(jìn)程既費(fèi)時(shí)又需要大量?jī)?nèi)存,影響了資源的使用效率,導(dǎo)致性能降低并增加等待時(shí)間;由于SQL與HTML差異很大,CGI程序中的轉(zhuǎn)換代碼編寫繁瑣,維護(hù)困難;安全性差,缺少用戶訪問(wèn)控制,對(duì)數(shù)據(jù)庫(kù)難以設(shè)置安全訪問(wèn)權(quán)限;HTTP協(xié)議是無(wú)狀態(tài)且沒(méi)有常連接的協(xié)議,DBMS事務(wù)的提交與否無(wú)法得到驗(yàn)證,不能構(gòu)造Web上的OLTP(On-LineTransactionProcessing聯(lián)機(jī)事務(wù)處理)應(yīng)用。ODBC的體系結(jié)構(gòu)基于擴(kuò)展的web服務(wù)器API作為dll駐留在web服務(wù)器中,功能與CGI類似。與web服務(wù)器結(jié)合緊密,占用資源少各個(gè)廠家的API兼容性差,編程復(fù)雜,多線程,同步,直接協(xié)議編程,錯(cuò)誤處理等ASP(ActiveServerPages)基于組件(com)模型,結(jié)合html腳本可以直接在html文本中包含可執(zhí)行的腳本,html文本和腳本的開發(fā)結(jié)合為一個(gè)過(guò)程JDBCJava執(zhí)行SQL語(yǔ)句的API,由一系列的類和接口組成(Java.sql包中)通過(guò)JDBC,Javaapplet可以直接與數(shù)據(jù)庫(kù)連接、查詢ODBC的體系結(jié)構(gòu)客戶端首先訪問(wèn)Web服務(wù)器,下載Java字節(jié)碼文件,并將Applet相關(guān)類的字節(jié)碼文件和JDBC接口字節(jié)碼文件下栽到客戶端,然后與Web服務(wù)器脫離,接著Applet根據(jù)數(shù)據(jù)庫(kù)地址,端口號(hào)和帳號(hào)與數(shù)據(jù)庫(kù)服務(wù)器連接進(jìn)行交互,這樣用戶與數(shù)據(jù)庫(kù)服務(wù)器的交互是由瀏覽器直接完成的。Web數(shù)據(jù)庫(kù)中間件體系結(jié)構(gòu)數(shù)據(jù)庫(kù)應(yīng)用程序
客戶端網(wǎng)絡(luò)支撐軟件
數(shù)據(jù)庫(kù)引擎數(shù)據(jù)庫(kù)服務(wù)器網(wǎng)絡(luò)支撐軟件數(shù)據(jù)庫(kù)網(wǎng)關(guān)驅(qū)動(dòng)程序管理器驅(qū)動(dòng)程序圖10.5基于網(wǎng)關(guān)機(jī)制的多層驅(qū)動(dòng)程序的ODBC結(jié)構(gòu)(三層結(jié)構(gòu))客戶瀏覽器(網(wǎng)絡(luò))WWW服務(wù)器數(shù)據(jù)庫(kù)服務(wù)器ODBC的體系結(jié)構(gòu)驅(qū)動(dòng)程序管理器:一個(gè)動(dòng)態(tài)鏈接庫(kù)(DLL),ODBC32.DLL用于連接各種DBS的DBMS驅(qū)動(dòng)程序,管理應(yīng)用程序和DBMS驅(qū)動(dòng)程序之間的交互作用(通信)。驅(qū)動(dòng)程序管理器的主要功能如下:為不同驅(qū)動(dòng)程序的ODBC函數(shù)提供單一的入口;檢查ODBC調(diào)用參數(shù)的合法性和記錄ODBC函數(shù)的調(diào)用;為應(yīng)用程序加載DBMS驅(qū)動(dòng)程序;調(diào)用正確的DBMS驅(qū)動(dòng)程序;提供驅(qū)動(dòng)程序信息。ODBC的體系結(jié)構(gòu)應(yīng)用程序主要完成:連接數(shù)據(jù)庫(kù); 向數(shù)據(jù)源發(fā)送SQL語(yǔ)句;為SQL語(yǔ)句執(zhí)行結(jié)果分配存儲(chǔ)空間;讀取結(jié)果;處理錯(cuò)誤;
向用戶提交處理結(jié)果;事務(wù)提交和回退操作;斷開與數(shù)據(jù)源的連接。ODBC的特性從ODBC的體系結(jié)構(gòu)可以看出,ODBC技術(shù)有下列三個(gè)特性:(1)ODBC是一個(gè)調(diào)用層的接口。(2)ODBC定義了標(biāo)準(zhǔn)的SQL語(yǔ)法。(3)ODBC提供一個(gè)驅(qū)動(dòng)程序管理器來(lái)管理 并同時(shí)訪問(wèn)多個(gè)DBMS系統(tǒng)。ODBC接口ODBC應(yīng)用程序的基本流程ODBC句柄數(shù)據(jù)源的連接與斷開SQL語(yǔ)句的執(zhí)行查詢結(jié)果的獲取應(yīng)用程序的基本流程分配環(huán)境句柄
分配連接句柄
與服務(wù)器連接分配語(yǔ)句句柄
語(yǔ)句處理和檢索
與服務(wù)器斷開釋放語(yǔ)句句柄釋放連接句柄釋放環(huán)境句柄SQLAllocEnvSQLAllocConnectSQLConnectSQLAllocStmtSQLExecDirect(直接執(zhí)行)SQLPrepare(語(yǔ)句預(yù)備)SQLExecute(語(yǔ)句執(zhí)行)SQLDisconnectSQLFreeStmtSQLFreeConnectSQLFreeEnv初始化
SQL處理
終止
圖10.6ODBC應(yīng)用程序的基本流程ODBC句柄
環(huán)境句柄應(yīng)用程序連接句柄連接句柄連接句柄語(yǔ)句句柄語(yǔ)句句柄語(yǔ)句句柄(只有一個(gè))…………圖10.7三種句柄之間的關(guān)系ODBC句柄…………環(huán)境句柄(定義DB應(yīng)用環(huán)境)連接句柄(定義一個(gè)DB連接)語(yǔ)句句柄(定義一個(gè)SQL語(yǔ)句)□□□henvhdbc
hstmt
圖10.8各種句柄之間的關(guān)系ODBC句柄一個(gè)ODBC句柄(Handle):一個(gè)應(yīng)用程序變量,用來(lái)存儲(chǔ)關(guān)于應(yīng)用程序的上下文信息和應(yīng)用程序所用到的一些對(duì)象。ODBC使用三個(gè)句柄環(huán)境句柄,一個(gè)環(huán)境句柄可以與多個(gè)連接句柄相連連接句柄,一個(gè)連接句柄可與多個(gè)語(yǔ)句句柄相連語(yǔ)句句柄,個(gè)應(yīng)用程序只有一個(gè)環(huán)境句柄。環(huán)境句柄定義一個(gè)數(shù)據(jù)庫(kù)環(huán)境, 連接句柄定義一個(gè)數(shù)據(jù)庫(kù)連接, 語(yǔ)句句柄定義一條SQL語(yǔ)句。對(duì)于句柄,有兩個(gè)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)語(yǔ)句句柄(StatementsHandles) (1)分配語(yǔ)句句柄函數(shù):SQLAllocStmt(hdbc,phstmt) (2)釋放語(yǔ)句句柄函數(shù):SQLFreeStmt(hstmt,fOption)
數(shù)據(jù)源的連接與斷開(1)連接數(shù)據(jù)源的函數(shù)
SQLConnect(hdbc,szDSN,cbDSN,szUID,cbUID,szAuthStr,cbAuthStr)。 參數(shù)hdbc是一個(gè)已經(jīng)分配的連接分配; 參數(shù)szDSN和cbDSN分別表示系統(tǒng)所要連接的數(shù)據(jù)源 名稱及其長(zhǎng)度; 參數(shù)szUID和cbUID分別表示用戶標(biāo)識(shí)符及其長(zhǎng)度; 參數(shù)szAuthStr和cbAuthStr分別表示權(quán)限字符串 及其長(zhǎng)度。(2)斷開數(shù)據(jù)源函數(shù)
SQLDisconnect(hdbc)參數(shù)hdbc是要斷開的連接句柄。
SQL語(yǔ)句的執(zhí)行1.直接執(zhí)行SQL語(yǔ)句的函數(shù)SQLExecDirect(hstmt,szSqlStr,cbSqlStr)其中,參數(shù)hstmt是一個(gè)有效的語(yǔ)句句柄; 參數(shù)szSqlStr和cbSqlStr分別表示將要執(zhí)行 的SQL語(yǔ)句的字符串及其長(zhǎng)度。例如,要以直接執(zhí)行的方法列出學(xué)生表中的信息,調(diào)用該函數(shù)的格式是:retcode=SQLExecDirect(hstmt,“SELECT*FROMS”,SQL_NTS)SQL語(yǔ)句的執(zhí)行main(){HENV henv; /*說(shuō)明henv是一個(gè)環(huán)境型變量*/HDBC hdbc; /*說(shuō)明hdbc是一個(gè)連接型變量*/HSTMT hstmt /*說(shuō)明hstmt是一個(gè)語(yǔ)句句柄變量*/RETCODE retcode; /*說(shuō)明retcode是一個(gè)返回變量*/SQLAllocEnv(&henv); /*分配一個(gè)環(huán)境句柄*/SQLAllocConnect(henv,&hdbc);/*分配一個(gè)連接句柄*/SQLConnect(hdbc,“學(xué)生”,SQL_NTS,NULL,0,NULL,0); /*連接數(shù)據(jù)源*/SQLAllocStmt(hdbc,&hstmt); /*分配一個(gè)語(yǔ)句句柄*/retcode=SQLExecDirect(hstmt,“SELECT*FROMS”,SQL_NTS); /*執(zhí)行語(yǔ)句*/
……
/*結(jié)果集處理*/SQLDisconnect(hdbc); /*斷開數(shù)據(jù)源*/SQLFreeStmt(hstmt,SQL_DROP)/*釋放一個(gè)語(yǔ)句句柄*/SQLFreeConnect(hdbc); /*釋放一個(gè)連接句柄*/SQLFreeEnv(henv); /*當(dāng)應(yīng)用完成后,釋放環(huán)境句柄*/}SQL語(yǔ)句的執(zhí)行2.有準(zhǔn)備地執(zhí)行SQL語(yǔ)句的函數(shù)(1)SQL語(yǔ)句預(yù)備函數(shù)
SQLPrepare(hstmt,szSqlStr,cbSqlStr)
其中,參數(shù)hstmt是一個(gè)有效的語(yǔ)句句柄,參數(shù)szSqlStr和cbSqlStr分別表示將要執(zhí)行的SQL語(yǔ)句的字符串及其長(zhǎng)度。(2)SQL語(yǔ)句執(zhí)行函數(shù)
SQLExecute(hstmt) 其中參數(shù)hstmt是一個(gè)有效的語(yǔ)句句柄。查詢結(jié)果的獲?。?)移動(dòng)光標(biāo)函數(shù) SQLFetch(hstmt)該函數(shù)的功能是把光標(biāo)移到下一行。(2)讀光標(biāo)指向行中一列值的函數(shù)SQLGetData(hstmt,icol,fCType, rgbValue,cbValueMax,pcbValue)查詢結(jié)果的獲取例10.2在例10.1程序的中間省略部分“……”插入下面一段語(yǔ)句,執(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的符合性級(jí)別API符合性的三個(gè)級(jí)別SQL符合性的三個(gè)級(jí)別ODBCAPI與SQLCLI之間的協(xié)調(diào)SQLCLI與嵌入式SQL的比較SQLCLI的應(yīng)用ODBC的符合性級(jí)別ODBC問(wèn)題:有的SQL功能在某廠商的DBMS上沒(méi)有實(shí)現(xiàn),則ODBC就不可能為應(yīng)用程序完成這一功能;有的SQL功能是SQL標(biāo)準(zhǔn)新增加的,而DBMS廠商沒(méi)有及時(shí)跟上,則ODBC同樣也無(wú)法完成新功能。對(duì)于具體DBMS不支持的SQL功能,DBMS要通報(bào)給應(yīng)用程序。從ODBC本身來(lái)講,它最好支持完全的SQL,這樣才能做到應(yīng)用程序不用修改就可以訪問(wèn)不同的數(shù)據(jù)源。API符合性的三個(gè)級(jí)別
1.核心級(jí)API 核心級(jí)API有22個(gè)函數(shù),包括了完成一個(gè)數(shù)據(jù)庫(kù)應(yīng)用程序所要做的所有必備的工作。2.1級(jí)API 1級(jí)API除包括核心級(jí)API22個(gè)函數(shù)外,還包括16個(gè)附加函數(shù)。3.2級(jí)API 2級(jí)API除包括核心級(jí)API22個(gè)函數(shù)和1級(jí)API16個(gè)函數(shù)外,還包括17個(gè)附加函數(shù)。SQL符合性的三個(gè)級(jí)別
SQL符合性級(jí)別不是對(duì)編程的限制,應(yīng)用程序可以自由地使用各種SQL語(yǔ)句,如果DBMS不支持,則驅(qū)動(dòng)程序會(huì)報(bào)告。SQL符合性級(jí)別有:最小級(jí)SQL,核心級(jí)SQL,擴(kuò)展級(jí)SQL。ODBC定義了這三個(gè)級(jí)別的SQL語(yǔ)法兼容性,每一后繼級(jí)別都建立在較低級(jí)別的基礎(chǔ)上,它包括前一級(jí)別所支持的SQL語(yǔ)句,也增加了一些語(yǔ)句。ODBCAPI與SQLCLI 之間的協(xié)調(diào)MS公司于1991年11月提出了一個(gè)關(guān)于ODBC的體系結(jié)構(gòu),并在1992年發(fā)布了ODBC1.0規(guī)范,隨后以SDK形式出版并發(fā)行了這種面向SQL的API。數(shù)據(jù)庫(kù)公司國(guó)際財(cái)團(tuán)SQLAccessGroup(SAG)和標(biāo)準(zhǔn)化組織X/Open在1992年聯(lián)合出版了一個(gè)規(guī)范,該規(guī)范定義了調(diào)用級(jí)界面(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中,都建議用戶:廢棄三個(gè)分配函數(shù)SQLAllocEnv、SQLAllocConnect和SQLAllocStmt, 而只使用一個(gè)函數(shù)SQLAllocHandle,廢棄三個(gè)釋放函數(shù)SQLFreeEnv、SQLFreeConnect和SQLFreeStmt, 而只使用一個(gè)函數(shù)SQLFreeHandle。SQLCLI與嵌入式SQL 的比較與嵌入式SQL相比,SQLCLI有下列四個(gè)優(yōu)點(diǎn):(1)標(biāo)準(zhǔn)化、通用化。將數(shù)據(jù)源的差異屏蔽在驅(qū)動(dòng)程序?qū)崿F(xiàn)之中,改善了應(yīng)用程序的可移植性。(2)能支持應(yīng)用程序并發(fā)訪問(wèn)不同數(shù)據(jù)源或同一數(shù)據(jù)源。對(duì)于不同的訪問(wèn)有不同的連接句柄,彼此不會(huì)干擾。(3)免除了預(yù)編譯步驟,省去了說(shuō)明游標(biāo)和操作游標(biāo)的語(yǔ)句,不需要說(shuō)明主變量,應(yīng)用程序中任何變量都可以和數(shù)據(jù)源交換數(shù)據(jù)。(4)對(duì)訪問(wèn)數(shù)據(jù)源的每一步驟,在執(zhí)行時(shí)都提供相應(yīng)的診斷信息,便于調(diào)試;而在嵌入式SQL中,只有在訪問(wèn)結(jié)束時(shí)才提供診斷信息。SQLCLI與嵌入式SQL 的比較在嵌入式SQL中,SQL函數(shù)是編譯執(zhí)行,比起從DLL動(dòng)態(tài)調(diào)用執(zhí)行,性能要好。但對(duì)于訪問(wèn)多數(shù)據(jù)源或數(shù)據(jù)源變化大的應(yīng)用程序,選用SQLCLI無(wú)疑是上策。SQLCLI為應(yīng)用程序訪問(wèn)數(shù)據(jù)源提供了一個(gè)標(biāo)準(zhǔn)接口,目前已為工業(yè)界和用戶廣泛接受。在20世紀(jì)90年代,為了比較系統(tǒng)地解決分布異構(gòu)環(huán)境下的計(jì)算、互操作、互訪問(wèn)等系統(tǒng)集成問(wèn)題,相繼出現(xiàn)了以對(duì)象為基礎(chǔ)的分布對(duì)象計(jì)算模型,其中著名的有COM/DCOM(ComponentObjectModel/DistributedCOM),CORBA(CommonObjectRequestBrokerArchitecture)和JavaBeans。這三個(gè)模型已在工業(yè)界流行,并且成為工業(yè)標(biāo)準(zhǔn)或事實(shí)上的工業(yè)標(biāo)準(zhǔn),可望逐步發(fā)展成為國(guó)際標(biāo)準(zhǔn)。SQL/CLI的應(yīng)用API是微軟公司ODBC技術(shù)的術(shù)語(yǔ),是非SQL名稱。在SQL標(biāo)準(zhǔn)中,稱為“調(diào)用層接口”(CallLevelInterface,簡(jiǎn)記為CLI)。SQL/CLI是ODBC技術(shù)的延續(xù)。下面介紹SQL/CLI的使用,用C語(yǔ)言作為宿主語(yǔ)言。CLI定義了一套可以從宿主語(yǔ)言調(diào)用的公共函數(shù),每一個(gè)函數(shù)具有一個(gè)名稱和一個(gè)要求的算法(當(dāng)使用這個(gè)函數(shù)調(diào)用時(shí),DBMS應(yīng)該做什么)。在SQL3的第三部分介紹了SQL/CLI。SQL/CLI的應(yīng)用使用SQL/CLI時(shí),有必要將宿主程序與數(shù)據(jù)庫(kù)交互的有關(guān)信息記錄在運(yùn)行時(shí)數(shù)據(jù)結(jié)果中。此信息保存在以下四種類型的記錄中,表示為C數(shù)據(jù)類型中的復(fù)合結(jié)構(gòu)(Struct):●環(huán)境記錄(EnvironmentRecord):用作為一個(gè)容器,設(shè)置環(huán)境信息,以保存一個(gè)或多個(gè)數(shù)據(jù)庫(kù)連接?!襁B接記錄(ConnectionRecord):保存一個(gè)特定數(shù)據(jù)庫(kù)連接所需的信息,表示應(yīng)用系統(tǒng)與數(shù)據(jù)源之間的連接。●語(yǔ)句記錄(StatementRecord):保存一個(gè)SQL語(yǔ)句所需的信息?!衩枋鲇涗?DescriptionRecord):保存元組或參數(shù)的有關(guān)信息,如元組中的屬性個(gè)數(shù)及其類型,或某個(gè)函數(shù)調(diào)用中的參數(shù)個(gè)數(shù)及其類型。SQL/CLI的應(yīng)用若要?jiǎ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>指示了新句柄在哪個(gè)容器中創(chuàng)建。<handle_2>是指向新創(chuàng)建的<handle_type>類型記錄的 指針(句柄)。SQL/CLI的應(yīng)用例10.3下面的程序段是讀?。ㄝ斎耄┠硨W(xué)生的學(xué)號(hào),然后查詢關(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下面的程序段先讀?。ㄝ斎耄┮粋€(gè)年齡值,然后檢索符合這個(gè)年齡的學(xué)生。接著用一個(gè)循環(huán)處理各個(gè)學(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簡(jiǎn)介JDBC驅(qū)動(dòng)類型JDBCAPIJDBC的發(fā)展JDBC簡(jiǎn)介Java于1995年5月正式公布,數(shù)據(jù)庫(kù)應(yīng)用程序中,沒(méi)有一個(gè)Java語(yǔ)言的API,編程人員不得不在Java程序中加入C語(yǔ)言的ODBC函數(shù)調(diào)用。很多Java的優(yōu)秀特性無(wú)法充分發(fā)揮平臺(tái)無(wú)關(guān)性面向?qū)ο筇匦訨DBC是為在JavaApplet和應(yīng)用程序中訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)而設(shè)計(jì)的API類。JDBC獨(dú)立于平臺(tái)和數(shù)據(jù)庫(kù)。在JDBC規(guī)范中,提供了SQL數(shù)據(jù)庫(kù)訪問(wèn)的JAVA方法。JDBC應(yīng)用框架JDBC兩層模型JDBC三層模型JDBC與ODBCODBCAPI是C的庫(kù)函數(shù),在JAVA程序中不能直接使用。非面型對(duì)象大量指針因?yàn)檎Z(yǔ)言本身的差異,不能將ODBCCAPI逐字翻譯為JAVAAPI。使用JDBC使應(yīng)用程序保持“純JAVA”的可移植性等。JDBC驅(qū)動(dòng)類型Java應(yīng)用程序JDBC驅(qū)動(dòng)管理器JDBC網(wǎng)絡(luò)驅(qū)動(dòng)JDBC-ODBC橋ODBC和數(shù)據(jù)庫(kù)驅(qū)動(dòng)數(shù)據(jù)庫(kù)驅(qū)動(dòng)A數(shù)據(jù)庫(kù)驅(qū)動(dòng)B專用數(shù)據(jù)庫(kù)協(xié)議JDBC中間協(xié)議JDBCAPIJDBC驅(qū)動(dòng)APIJDBC實(shí)現(xiàn)JDBC驅(qū)動(dòng)類型JDBC-ODBC橋(JDBC-ODBCbridge)JDBC調(diào)用ODBCLibaryODBCDriverDatabase
。要求ODBC代碼、client端代碼都要在客戶機(jī)上安裝適合企業(yè)網(wǎng),但由于效率較低不適合大量數(shù)據(jù)訪問(wèn)的應(yīng)用,也不適合Internet應(yīng)用,因?yàn)椴荒芤笏锌蛻舳及惭bODBC。問(wèn)題:Java應(yīng)用程序具有平臺(tái)相關(guān)性,安全性降低,可移植性差。JDBC驅(qū)動(dòng)類型本地API驅(qū)動(dòng):把客戶機(jī)API上的JDBC調(diào)用轉(zhuǎn)換為Oracle、Sybase、DB2等DBMS本地API調(diào)用執(zhí)行效率高于JDBC-ODBC橋JDBC調(diào)用數(shù)據(jù)庫(kù)的Client端API,也需要在客戶機(jī)上安裝代碼。不適合InternetJDBC驅(qū)動(dòng)類型網(wǎng)絡(luò)協(xié)議完全JAVA驅(qū)動(dòng):Application>JdbcDriver>javamiddleware>JDBCDriver>Databasejdbc先把對(duì)數(shù)局庫(kù)的訪問(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開發(fā)的,那么在在中間層也可以使用1,2型jdbc驅(qū)動(dòng)JDBC驅(qū)動(dòng)類型網(wǎng)絡(luò)協(xié)議完全JAVA驅(qū)動(dòng):驅(qū)動(dòng)是基于server的,不需要在客戶端加載數(shù)據(jù)庫(kù)廠商提供的代碼庫(kù),可以設(shè)計(jì)的很小,多了一個(gè)中間層傳遞數(shù)據(jù),它的執(zhí)行效率還不是最好JDBC驅(qū)動(dòng)類型本地協(xié)議完全JAVA驅(qū)動(dòng)JDBC調(diào)用直接轉(zhuǎn)換為DBMS所使用的網(wǎng)絡(luò)協(xié)議的請(qǐng)求Application>Jdbc>databaseengine>database驅(qū)動(dòng)完全由java實(shí)現(xiàn),實(shí)現(xiàn)了平臺(tái)獨(dú)立性效率最高適合Internet上單一數(shù)據(jù)庫(kù)的工作組情形JDBCAPI功能建立與數(shù)據(jù)庫(kù)的連接發(fā)送SQL語(yǔ)句處理結(jié)果JDBCAPI類類型 JDBC類驅(qū)動(dòng)程序管理Java.sql.Driverjava.sql.DriverManagerjava.sql.DrivePropertyInfo數(shù)據(jù)庫(kù)連接Java.sql.ConnectionSQL語(yǔ)句java.sql.Statementjava.sql.PreparedStatementjava.sql.CallableStatement數(shù)據(jù)java.sql.ResultSet錯(cuò)誤java.sql.SQLExceptionjava.sql.SQLWarningJDBC類層次驅(qū)動(dòng)程序管理器連接連接連接語(yǔ)句語(yǔ)句可調(diào)用語(yǔ)句準(zhǔn)備語(yǔ)句executeUpdate()executeQuery()execute()getMoreResults()結(jié)果組元數(shù)據(jù)
數(shù)據(jù)getResultsSet()……建立與數(shù)據(jù)庫(kù)的連接驅(qū)動(dòng)程序管理Java.sql.Driver:每個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序類都要實(shí)現(xiàn)的接口Java.Sql.DriverPropertyInfo:驅(qū)動(dòng)程序和連接建立需要的特性Java.sql.DriverManager:提供驅(qū)動(dòng)程序需要的服務(wù),包括加載驅(qū)動(dòng)程序,驅(qū)動(dòng)相應(yīng)驅(qū)動(dòng)程序建立連接等從系統(tǒng)屬性java.sql中讀取Driver的類名,并一一注冊(cè)。在程序中使用Class.forName()方法動(dòng)態(tài)裝載并注冊(cè)DriverDriverManager.getConnection()與數(shù)據(jù)庫(kù)建立連接傳送SQL語(yǔ)句在數(shù)據(jù)庫(kù)連接上創(chuàng)建Statement對(duì)象,將各種SQL語(yǔ)句發(fā)送到所連接的數(shù)據(jù)庫(kù)。Statementstmt=con.createStatement();ResultSetrs=stmt.executeQuery(“SELECTa,b,cFROMTable1”);對(duì)于多次執(zhí)行但參數(shù)不同的SQL語(yǔ)句,可以使用PreparedStatement對(duì)象。使用CallableStatement對(duì)象調(diào)用數(shù)據(jù)庫(kù)上的存儲(chǔ)過(guò)程。處理結(jié)果集結(jié)果集是查詢語(yǔ)句返回的數(shù)據(jù)庫(kù)記錄的集合。在結(jié)果集中通過(guò)游標(biāo)(Cursor)控制具體記錄的訪問(wèn)。SQL數(shù)據(jù)類型與JAVA數(shù)據(jù)類型的轉(zhuǎn)換根據(jù)SQL數(shù)據(jù)類型的不同,使用不同的方法讀取數(shù)據(jù)。/*處理結(jié)果集rs*/while(rs.next()){
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版本二手房買賣合同針對(duì)房產(chǎn)稅繳納的約定3篇
- 2025年個(gè)人水利工程建設(shè)與維護(hù)承包合同模板4篇
- 2025年度生態(tài)環(huán)保幕墻材料采購(gòu)與安裝勞務(wù)分包合同范例4篇
- 二零二五版汽車4S店促銷員銷售服務(wù)合同3篇
- 2025年度新材料研發(fā)與應(yīng)用推廣咨詢服務(wù)合同4篇
- 二手住宅買賣合同(海南版2024)
- 專利技術(shù)成果實(shí)施許可合同(2024版)版B版
- 2025年度智慧城市運(yùn)營(yíng)管理出資合同4篇
- 二零二五年度危險(xiǎn)品運(yùn)輸合同框架協(xié)議2篇
- 二零二五年度寵物活體活體領(lǐng)養(yǎng)援助合同4篇
- 節(jié)前停工停產(chǎn)與節(jié)后復(fù)工復(fù)產(chǎn)安全注意事項(xiàng)課件
- 設(shè)備管理績(jī)效考核細(xì)則
- 中國(guó)人民銀行清算總中心直屬企業(yè)2023年招聘筆試上岸歷年典型考題與考點(diǎn)剖析附帶答案詳解
- (正式版)SJT 11449-2024 集中空調(diào)電子計(jì)費(fèi)信息系統(tǒng)工程技術(shù)規(guī)范
- 廣州綠色金融發(fā)展現(xiàn)狀及對(duì)策的研究
- 人教版四年級(jí)上冊(cè)加減乘除四則混合運(yùn)算300題及答案
- 合成生物學(xué)技術(shù)在生物制藥中的應(yīng)用
- 消化系統(tǒng)疾病的負(fù)性情緒與心理護(hù)理
- 高考語(yǔ)文文學(xué)類閱讀分類訓(xùn)練:戲劇類(含答案)
- 協(xié)會(huì)監(jiān)事會(huì)工作報(bào)告大全(12篇)
- WS-T 813-2023 手術(shù)部位標(biāo)識(shí)標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論