第8章數(shù)據(jù)庫編程(2)_第1頁
第8章數(shù)據(jù)庫編程(2)_第2頁
第8章數(shù)據(jù)庫編程(2)_第3頁
第8章數(shù)據(jù)庫編程(2)_第4頁
第8章數(shù)據(jù)庫編程(2)_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1/16數(shù)據(jù)庫原理及應用數(shù)據(jù)庫原理及應用Principle and Application of Database第八章數(shù)據(jù)庫編程第八章數(shù)據(jù)庫編程( (續(xù)續(xù)) )2/16掌握掌握ODBC的工作原理的工作原理理解理解ODBC API基礎基礎掌握掌握ODBC的工作流程的工作流程熟練掌握熟練掌握ODBC編程實例編程實例3/16數(shù)據(jù)庫互連概述:數(shù)據(jù)庫互連概述:應用程序需要共享多個部門的數(shù)據(jù)資源,訪應用程序需要共享多個部門的數(shù)據(jù)資源,訪問不同的問不同的RDBMS,盡管這些,盡管這些RDBMS均遵循均遵循SQL標準,但它標準,但它們還存在著許多差異。為了能使數(shù)據(jù)庫系統(tǒng)開放和互連,微軟們還存在著許多差異。為

2、了能使數(shù)據(jù)庫系統(tǒng)開放和互連,微軟推出了推出了ODBC(Open DataBase Connectivity) ,它建立了一,它建立了一組規(guī)范,并提供了一組訪問數(shù)據(jù)庫的標準組規(guī)范,并提供了一組訪問數(shù)據(jù)庫的標準API。ODBC工作原理概述:工作原理概述:使用使用ODBC開發(fā)應用系統(tǒng),體系結(jié)構(gòu)由開發(fā)應用系統(tǒng),體系結(jié)構(gòu)由四個部分構(gòu)成。四個部分構(gòu)成。4/16應用程序:應用程序:提供用戶界面、應用邏輯和事務邏輯,使用提供用戶界面、應用邏輯和事務邏輯,使用ODBC API調(diào)用接口與數(shù)據(jù)庫進行交互,內(nèi)容有:調(diào)用接口與數(shù)據(jù)庫進行交互,內(nèi)容有:請求連接數(shù)據(jù)庫;請求連接數(shù)據(jù)庫;向數(shù)據(jù)源發(fā)送向數(shù)據(jù)源發(fā)送SQL語句;語

3、句;為為SQL語句執(zhí)行結(jié)果分配存儲空間,定義所讀取的數(shù)據(jù)格式;語句執(zhí)行結(jié)果分配存儲空間,定義所讀取的數(shù)據(jù)格式;進行數(shù)據(jù)處理并向用戶提交處理結(jié)果;進行數(shù)據(jù)處理并向用戶提交處理結(jié)果;請求事務的提交和回滾操作;請求事務的提交和回滾操作;斷開與數(shù)據(jù)源的連接。斷開與數(shù)據(jù)源的連接。驅(qū)動程序管理器:驅(qū)動程序管理器:用來管理各種驅(qū)動程序,主要功能包括裝載用來管理各種驅(qū)動程序,主要功能包括裝載ODBC驅(qū)動程序、選擇和連接正確的驅(qū)動程序、管理數(shù)據(jù)源、驅(qū)動程序、選擇和連接正確的驅(qū)動程序、管理數(shù)據(jù)源、檢查檢查ODBC調(diào)用參數(shù)的合法性及記錄調(diào)用參數(shù)的合法性及記錄ODBC函數(shù)的調(diào)用等,當函數(shù)的調(diào)用等,當應用程序需要時返回

4、驅(qū)動程序的有關信息。應用程序需要時返回驅(qū)動程序的有關信息。5/16驅(qū)動程序:驅(qū)動程序:提供應用系統(tǒng)與數(shù)據(jù)庫平臺的獨立性。應用程序不提供應用系統(tǒng)與數(shù)據(jù)庫平臺的獨立性。應用程序不能直接存取數(shù)據(jù)庫,其各種操作請求由驅(qū)動程序管理器提交給能直接存取數(shù)據(jù)庫,其各種操作請求由驅(qū)動程序管理器提交給某個驅(qū)動程序,通過調(diào)用驅(qū)動程序所支持的函數(shù)來存取數(shù)據(jù)庫某個驅(qū)動程序,通過調(diào)用驅(qū)動程序所支持的函數(shù)來存取數(shù)據(jù)庫,數(shù)據(jù)庫的操作結(jié)果也通過驅(qū)動程序返回給應用程序。若應用,數(shù)據(jù)庫的操作結(jié)果也通過驅(qū)動程序返回給應用程序。若應用程序要操縱不同的數(shù)據(jù)庫,就要動態(tài)地鏈接不同的驅(qū)動程序。程序要操縱不同的數(shù)據(jù)庫,就要動態(tài)地鏈接不同的驅(qū)動

5、程序。數(shù)據(jù)源:數(shù)據(jù)源:是用戶最終訪問的數(shù)據(jù),包含了數(shù)據(jù)庫位置和數(shù)據(jù)庫是用戶最終訪問的數(shù)據(jù),包含了數(shù)據(jù)庫位置和數(shù)據(jù)庫類型等信息,實際上是一種數(shù)據(jù)連接的抽象。類型等信息,實際上是一種數(shù)據(jù)連接的抽象。ODBC給每個被給每個被訪問的數(shù)據(jù)源指定惟一的數(shù)據(jù)源名訪問的數(shù)據(jù)源指定惟一的數(shù)據(jù)源名DSN(Data Source Name),它包含了用戶名、服務器名和所連接的數(shù)據(jù)庫名,用戶無需,它包含了用戶名、服務器名和所連接的數(shù)據(jù)庫名,用戶無需知道知道DBMS、網(wǎng)絡以及有關、網(wǎng)絡以及有關ODBC驅(qū)動程序的細節(jié),數(shù)據(jù)源對驅(qū)動程序的細節(jié),數(shù)據(jù)源對用戶是透明的。用戶是透明的。示例:配置學生表示例:配置學生表Studen

6、t對應的數(shù)據(jù)源對應的數(shù)據(jù)源stu?;诨贠DBC的數(shù)據(jù)庫應用本章不介紹,詳見第十三章。的數(shù)據(jù)庫應用本章不介紹,詳見第十三章。6/16ODBC API基礎:基礎:各數(shù)據(jù)庫廠商的各數(shù)據(jù)庫廠商的ODBC應用程序接口應用程序接口(ODBC Application Interface)都要符合都要符合API和語法的一致性。和語法的一致性。函數(shù)概述:函數(shù)概述:ODBC3.0標準提供了標準提供了76個函數(shù)接口,大致分為:個函數(shù)接口,大致分為:分配和釋放環(huán)境句柄、連接句柄、語句句柄。分配和釋放環(huán)境句柄、連接句柄、語句句柄。連接函數(shù)連接函數(shù)(SQLConnect等等)。與信息相關的函數(shù)與信息相關的函數(shù)(SQL

7、GetData等等)。執(zhí)行相關函數(shù)執(zhí)行相關函數(shù)(SQLExecDirect等等)。句柄及其屬性:句柄及其屬性:句柄是一代表指針的句柄是一代表指針的32位整數(shù)值,位整數(shù)值,ODBC3.0中句柄分為環(huán)境句柄、連接句柄、語句句柄和描述符句柄。中句柄分為環(huán)境句柄、連接句柄、語句句柄和描述符句柄。環(huán)境句柄:環(huán)境句柄:每個每個ODBC應用程序需要建立一個應用程序需要建立一個ODBC環(huán)境,分環(huán)境,分配一個環(huán)境句柄,存取數(shù)據(jù)的全局性背景如環(huán)境狀態(tài)、當前在配一個環(huán)境句柄,存取數(shù)據(jù)的全局性背景如環(huán)境狀態(tài)、當前在環(huán)境句柄上分配的連接句柄。環(huán)境句柄上分配的連接句柄。7/16連接句柄:連接句柄:一個環(huán)境句柄可以建立多個

8、連接句柄,每個連接句一個環(huán)境句柄可以建立多個連接句柄,每個連接句柄實現(xiàn)與一個數(shù)據(jù)源之間的連接。柄實現(xiàn)與一個數(shù)據(jù)源之間的連接。語句句柄:語句句柄:在一個連接中可以建立多個語句句柄,它不僅是一在一個連接中可以建立多個語句句柄,它不僅是一個個SQL語句,還包括語句,還包括SQL語句產(chǎn)生的結(jié)果集以及相關的信息。語句產(chǎn)生的結(jié)果集以及相關的信息。描述符句柄:描述符句柄:描述描述SQL語句的參數(shù)、結(jié)果集列的元數(shù)據(jù)集合。語句的參數(shù)、結(jié)果集列的元數(shù)據(jù)集合。數(shù)據(jù)類型:數(shù)據(jù)類型:ODBC定義了兩套數(shù)據(jù)類型,即定義了兩套數(shù)據(jù)類型,即SQL數(shù)據(jù)類型和數(shù)據(jù)類型和C數(shù)據(jù)類型,前者用于數(shù)據(jù)源,后者用于應用程序的數(shù)據(jù)類型,前者

9、用于數(shù)據(jù)源,后者用于應用程序的C代碼。代碼。ODBC的工作流程的工作流程配置數(shù)據(jù)源:配置數(shù)據(jù)源:示例:將示例:將ss數(shù)據(jù)庫定義成一個系統(tǒng)數(shù)據(jù)源。數(shù)據(jù)庫定義成一個系統(tǒng)數(shù)據(jù)源。初始化環(huán)境:初始化環(huán)境:調(diào)用調(diào)用SQLAllocHandle函數(shù)分配環(huán)境句柄。函數(shù)分配環(huán)境句柄。建立連接:建立連接:調(diào)用調(diào)用SQLAllocHandle函數(shù)分配連接句柄,通過函數(shù)分配連接句柄,通過SQLConnect與數(shù)據(jù)源連接,其輸入?yún)?shù)為數(shù)據(jù)源名稱、用戶與數(shù)據(jù)源連接,其輸入?yún)?shù)為數(shù)據(jù)源名稱、用戶ID和口令。和口令。8/16分配語句句柄:分配語句句柄:在處理任何在處理任何SQL語句之前,首先通過調(diào)用函數(shù)語句之前,首先通過調(diào)

10、用函數(shù)SQLAllocHandle分配一個語句句柄。分配一個語句句柄。執(zhí)行執(zhí)行SQL語句:語句:程序處理程序處理SQL語句有預處理語句有預處理(SQLPrepare)和和直接執(zhí)行直接執(zhí)行(SQLExecDirect)兩種方式。兩種方式。結(jié)果集處理:結(jié)果集處理:ODBC使用游標處理結(jié)果集的數(shù)據(jù),但其游標的使用游標處理結(jié)果集的數(shù)據(jù),但其游標的打開方式不同于嵌入式打開方式不同于嵌入式SQL,前者不是顯式聲明而是由系統(tǒng)自,前者不是顯式聲明而是由系統(tǒng)自動產(chǎn)生一個游標,結(jié)果集剛生成時,游標指向第一行數(shù)據(jù)之前動產(chǎn)生一個游標,結(jié)果集剛生成時,游標指向第一行數(shù)據(jù)之前,應用程序通過,應用程序通過SQLBindCo

11、l函數(shù)把查詢結(jié)果綁定到應用程序函數(shù)把查詢結(jié)果綁定到應用程序的緩沖區(qū)中,通過的緩沖區(qū)中,通過SQLFetch移動游標獲取結(jié)果集中的每一行移動游標獲取結(jié)果集中的每一行數(shù)據(jù),當緩沖區(qū)不足以容納所有數(shù)據(jù)時,可通過數(shù)據(jù),當緩沖區(qū)不足以容納所有數(shù)據(jù)時,可通過SQLGetData分多次獲取。分多次獲取。終止處理:終止處理:處理結(jié)束后,應用程序首先用處理結(jié)束后,應用程序首先用SQLFreeHandle釋釋放語句句柄,然后用放語句句柄,然后用SQLDisconnect斷開數(shù)據(jù)庫連接,最后斷開數(shù)據(jù)庫連接,最后用用SQLFreeHandle依次釋放連接句柄和環(huán)境句柄。依次釋放連接句柄和環(huán)境句柄。9/16一個一個OD

12、BC編程實例:在編程實例:在C語言中通過語言中通過ODBC訪問訪問Student表。表。 #include #include #include #include #include #include #include #define MaxNameLen 8 int main() SQLHENV henv=SQL_NULL_HENV; /定義環(huán)境句柄定義環(huán)境句柄 SQLHDBC hdbc1=SQL_NULL_HDBC; /定義數(shù)據(jù)庫連接句柄定義數(shù)據(jù)庫連接句柄 SQLHSTMT hstmt1=SQL_NULL_HSTMT; /定義語句句柄定義語句句柄10/16 /SQLBindCol variab

13、les SQLCHAR nameMaxNameLen; SQLCHAR deptMaxNameLen; SQLINTEGER columnLen=0; /數(shù)據(jù)庫定義中該屬性列的長度數(shù)據(jù)庫定義中該屬性列的長度 RETCODE retcode; /錯誤返回碼錯誤返回碼 /Allocate the ODBC Environment and save handle retcode=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv); if(retcode0) /錯誤處理錯誤處理 printf(allocate ODBC Environment handle er

14、rors.); return -1; /Notify ODBC this is an ODBC 3.0 application retcode=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3,SQL_IS_INTEGER);11/16 /Execute an SQL statement directly on the statement handle retcode=SQLExecDirect(hstmt1,(SQLCHAR*)SELECT sname, sdept FROM student,SQL_NTS

15、); if(retcode0) printf(name=%s dept=%sn,name,dept); else printf(name=%s dept=NULLn,name,dept); #else while(1) retcode=SQLFetch(hstmt1); if(retcode=SQL_NO_DATA) break; retcode=SQLGetData(hstmt1,1,SQL_C_CHAR,name, MaxNameLen,&columnLen); retcode=SQLGetData(hstmt1,2,SQL_C_CHAR,dept, MaxNameLen,&columnLen); if(columnLen0) printf(name=%s dept=%sn,name,dept); else printf(name=%s dept=NULLn,name,dept); 13/16 #endif /*Clean up*/ SQLFreeHand

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論