ch5_additional material_ODBC_第1頁
ch5_additional material_ODBC_第2頁
ch5_additional material_ODBC_第3頁
ch5_additional material_ODBC_第4頁
ch5_additional material_ODBC_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、開放數(shù)據(jù)庫互聯(lián)(ODBC)Open DataBase Connectivity使用ODBC的目的l根本原因在于存在不同的DBMSEmbedded SQL只能基于特定的一個數(shù)據(jù)庫,適應性和移植性差難以同時訪問多個數(shù)據(jù)庫并實現(xiàn)多個數(shù)據(jù)庫相互操作l微軟于1995年推出ODBCODBC的基本原理(1)l單數(shù)據(jù)庫系統(tǒng)ODBC的基本原理(2)l多數(shù)據(jù)庫系統(tǒng)ODBC的基本原理(3)l標準的訪問方式類似打印機管理ODBC的基本原理(4)lODBC的體系結(jié)構(gòu)ODBC的體系結(jié)構(gòu)(1)l用戶的ODBC應用程序l驅(qū)動程序管理器(ODBC Driver Manager)微軟提供l數(shù)據(jù)庫驅(qū)動程序(ODBC Driver)

2、DBMS廠商提供l數(shù)據(jù)庫源(Data Source)ODBC的體系結(jié)構(gòu)(2)l用戶的ODBC應用程序如何和數(shù)據(jù)庫交互ODBC API提供的接口函數(shù)SQLODBC的體系結(jié)構(gòu)(3)l驅(qū)動程序管理器(ODBC Driver Manager)的主要作用管理應用程序和驅(qū)動程序的通信裝載、管理驅(qū)動程序管理和配置數(shù)據(jù)源l負責的主要文件C:winntsystem32odbc32.dllODBC的體系結(jié)構(gòu)(4)l數(shù)據(jù)庫驅(qū)動程序(ODBC Driver)的作用對相應的數(shù)據(jù)源進行各種操作l數(shù)據(jù)庫驅(qū)動程序(ODBC Driver)的調(diào)用方式以動態(tài)鏈接庫形式(*.DLL)存在由應用程序命令裝載,由驅(qū)動程序管理器負責裝載

3、ODBC的體系結(jié)構(gòu)(5)l數(shù)據(jù)源管理數(shù)據(jù)源名(Data Source Name)l對應著一個具體數(shù)據(jù)庫的連接l包括了服務器名、驅(qū)動程序、數(shù)據(jù)庫名等信息使用ODBC的第一步是首先要建立數(shù)據(jù)源名添加數(shù)據(jù)源(1)l 如何打開 ODBC 數(shù)據(jù)源管理器 在 Windows XP Professional 中打開 ODBC 數(shù)據(jù)源管理器l在“開始”菜單中,單擊“控制面板”.l在“控制面板”(“分類視圖”)中,單擊“性能和維護”,再單擊“管理工具”,或者在“控制面板”(“經(jīng)典視圖”)中,單擊“管理工具”.l在“管理工具”中,單擊“數(shù)據(jù)源(ODBC)” 在 Windows 7 中打開 ODBC 數(shù)據(jù)源管理器l

4、在“開始”菜單中,單擊“控制面板”.l在“控制面板”(“分類視圖”)中,單擊“系統(tǒng)和安全”,再單擊“管理工具”.l在“管理工具”中,單擊“數(shù)據(jù)源(ODBC)”添加數(shù)據(jù)源(2)l系統(tǒng)DSN和用戶DSN區(qū)別l不同DBMS驅(qū)動程序的設(shè)置并不相同,由DBMS自身提供ODBC API(1)l理論上,為了互操作,所有DBMS提供的ODBC調(diào)用函數(shù)和SQL語句應該完全一致?不可能l驅(qū)動程序的一致性級別((Conformance Levels)API一致性:核心級、擴展1級、擴展2級語法一致性:最低限度SQL語法級、核心SQL語法級、擴展SQL語法級ODBC API(3)lODBC標準數(shù)據(jù)類型以“SQL_”開

5、頭,大寫SQL_CHAR、 SQL_DECIMAL 、 SQL_INTEGER 、 SQL_FLOAT 、 SQL_VARCHAR 、 SQL_BIT等由DBMS的驅(qū)動程序完成自身數(shù)據(jù)類型和ODBC標準數(shù)據(jù)類型的映射ODBC API(4)lODBC應用程序流程初始化階段l分配環(huán)境句柄l分配連接句柄在分配連接句柄前,最好先設(shè)置環(huán)境句柄所用的ODBC參數(shù)l建立連接 l分配語句句柄程序主體結(jié)束部分l釋放語句句柄 l斷開數(shù)據(jù)源連接l釋放連接句柄 l釋放環(huán)境句柄ODBC API(4)什么是句柄l指向一段數(shù)據(jù)結(jié)構(gòu)的指針(地址)指向一段數(shù)據(jù)結(jié)構(gòu)的指針(地址)l為什么要用句柄為什么要用句柄ODBC應用程序有自

6、己的運行環(huán)境,通過環(huán)境句應用程序有自己的運行環(huán)境,通過環(huán)境句柄獲得柄獲得一個環(huán)境句柄下可以建立多個連接句柄,一個連一個環(huán)境句柄下可以建立多個連接句柄,一個連接句柄對應著一個數(shù)據(jù)源連接接句柄對應著一個數(shù)據(jù)源連接一個連接中可以建立多個語句句柄一個連接中可以建立多個語句句柄ODBC API(4)什么是句柄l指向一段數(shù)據(jù)結(jié)構(gòu)的指針(地址)指向一段數(shù)據(jù)結(jié)構(gòu)的指針(地址)l為什么要用句柄為什么要用句柄ODBC應用程序有自己的運行環(huán)境,通過通過環(huán)應用程序有自己的運行環(huán)境,通過通過環(huán)境句柄獲得境句柄獲得一個環(huán)境句柄下可以建立多個連接句柄,一個連一個環(huán)境句柄下可以建立多個連接句柄,一個連接句柄對應著一個數(shù)據(jù)源連

7、接接句柄對應著一個數(shù)據(jù)源連接一個連接中可以建立多個語句句柄一個連接中可以建立多個語句句柄ODBC應用應用程序程序環(huán)境句柄環(huán)境句柄連接句柄連接句柄數(shù)據(jù)源數(shù)據(jù)源語句句柄語句句柄描述描述111n1n111nODBC API(5)l 申請句柄:申請句柄:lSQLRETURN SQLAllocHandle(SQLRETURN SQLAllocHandle(HandleTypeHandleType, InputHandleInputHandle,OutputHandlePtrOutputHandlePtr); ); HandleType 是一個常數(shù),定義了希望分配的句柄是一個常數(shù),定義了希望分配的句柄類型

8、類型.可能值如下可能值如下:lSQL_HANDLE_ENV 環(huán)境句柄環(huán)境句柄(Environment handle)lSQL_HANDLE_DBC 連接句柄連接句柄(Connection handle)lSQL_HANDLE_STMT 語句句柄語句句柄(Statement handle)lSQL_HANDLE_DESC 描述符句柄描述符句柄(Descriptor handle) 描述符是一個數(shù)據(jù)集合描述了描述符是一個數(shù)據(jù)集合描述了SQL語句參數(shù)或結(jié)果集列的元數(shù)據(jù)語句參數(shù)或結(jié)果集列的元數(shù)據(jù)集合集合ODBC API(6)InputHandle 是指向父是指向父“文本文本”的句柄的句柄.環(huán)境環(huán)境句柄

9、的是句柄的是SQL_NULL_HANDLE或或NULL。OutputHandlePtr 如果調(diào)用成功,將指向一個雙字,其中包含了被分配的句柄.返回值返回值如下:lSQL_SUCCESS 函數(shù)成功完成.lSQL_SUCCESS_WITH_INFO 函數(shù)成功完成,但帶回非致命錯誤或警告.lSQL_ERROR 函數(shù)調(diào)用失敗.lSQL_INVALID_HANDLE 傳送給函數(shù)的句柄非法.ODBC API(6)SQLAllocHandlel retcode=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&hEnv);l SQLSetEnvAttr(henv, SQL_AT

10、TR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);l /將ODBC設(shè)置成為版本3,否則某些ODBC API 函不能被支持。l retcode= SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDBC);l retcode= SQLAllocHandle(SQL_HANDLE_STMT,hDBC,&hSTMT);ODBC API(7)l 連接數(shù)據(jù)庫:連接數(shù)據(jù)庫:l SQLRETURN SQLConnect( SQLHDBC ConnectionHandle, SQLCHAR * Serv

11、erName, SQLSMALLINT NameLength1, SQLCHAR * UserName, SQLSMALLINT NameLength2, SQLCHAR * Authentication, SQLSMALLINT NameLength3);ConnectionHanlde:為DBC句柄,即SQLAllocHandle(SQL_HANDLE_DBC,hDBC,&hDBC);申請的句柄。ServerName:為ODBC的DSN名稱。NameLength1:指明參數(shù)ServerName數(shù)據(jù)的長度。ODBC API(8) UserName:數(shù)據(jù)庫用戶名。 NameLength

12、2:指明參數(shù)UserName數(shù)據(jù)的長度。 Authentication:數(shù)據(jù)庫用戶密碼。 NameLength3:指明參數(shù)Authentication數(shù)據(jù)的長度。 關(guān)于ServerName,UserName,Authentication參數(shù)長度可以直接指定也可以指定為SQL_NTS表明參數(shù)是以NULL字符結(jié)尾,由系統(tǒng)自動計算。l 例如:retcode = SQLConnect(hdbc, (SQLCHAR*) odbc_demo, SQL_NTS,(SQLCHAR*) user, SQL_NTS, (SQLCHAR*) password, SQL_NTS);ODBC API(9)l執(zhí)行SQL命

13、令的兩種方式直接執(zhí)行方式lSQLExecdirectlSQLBindCollSQLFetch預處理-執(zhí)行方式lSQLPreparelSQLBindParameterlSQLExecute預處理-執(zhí)行方式適用于SQL語句中含有參數(shù)的情況,或大批量多次執(zhí)行的情況ODBC API(9)-SQLExedirectl 直接執(zhí)行SQL語句l SQLRETURN SQLExecDirect( SQLHSTMT StatementHandle, SQLCHAR * StatementText, SQLINTEGER TextLength);StatementHandle:SQL語句句柄,即SQLAllocHa

14、ndle(SQL_HANDLE_STMT,hDBC,&hSTMT);申請的句柄。StatementText:SQL語句。TextLength:參數(shù)StatementText的長度,可以使用SQL_NTS表示由系統(tǒng)自動計算。l 如果函數(shù)執(zhí)行成功,你將會得到一個結(jié)果集,否則將返回錯誤信息ODBC API(9)-SQLBindColl 利用列綁定的方式在從結(jié)果集中讀取字段值l SQLRETURN SQLBindCol( SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER

15、 TargetValuePtr, SQLINTEGER BufferLength, SQLLEN * StrLen_or_Ind);ODBC API(9)-SQLBindColl StatementHandle:STMT句柄。l ColumnNumber:列的位置,從1開始計算。l ValueType:指明用于和參數(shù)綁定的C語言數(shù)據(jù)類型。l ParameterType:指明在存儲過程中ODBC數(shù)據(jù)類型。l BufferLength:指明參數(shù)指針所指向的緩沖區(qū)的字節(jié)數(shù)大小。對于字符串和結(jié)構(gòu)需要指明大小,而對于普通的變量如SQLINTEGER,SQLFLOAT等設(shè)置為0就可以了。l StrLen_

16、or_IndPtr:返回拷貝的緩沖區(qū)的數(shù)據(jù)的字節(jié)數(shù),數(shù)值型數(shù)據(jù)為0,字符型數(shù)據(jù)為SQL_NTS。ODBCAPI(9)-SQLGetDatal 得到當前記錄的對應列值l SQLRETURN SQLGetData( SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLINTEGER BufferLength, SQLINTEGER * StrLen_or_IndPtr);l SQLGetData和SQLBindCol的區(qū)別后者在fetch

17、后不必再次執(zhí)行,而前者要在循環(huán)中多次執(zhí)行ODBC API(9)-SQLFetchl 推進指向結(jié)果集的指針移動SQLRETURN SQLFetch(SQLHSTMT StatementHandle);l 光標前后移動SQLRETURN SQLFetchScroll( SQLHSTMT StatementHandle, SQLSMALLINT FetchOrientation, SQLINTEGER FetchOffset);lFetchOrientation 的值:SQL_FETCH_NEXT, SQL_FETCH_PRIOR, SQL_FETCH_FIRST,SQL_FETCH_LAST, S

18、QL_FETCH_ABSOLUTE, SQL_FETCH_RELATIVEODBC API(9)- SQLPreparel預編譯帶有參數(shù)的SQL語句lSQLRETURN SQLPrepare(SQLHSTMT StatementHandle,SQLCHAR * StatementText,SQLINTEGER TextLength);StatementHandle:STMT句柄。StatementText:包含SQL語句的字符串。TextLength:SQL語句的長度,或者使用SQL_NTS。ODBC API(9)- SQLExecutel執(zhí)行預處理過的SQL語句lSQLRETURN SQLE

19、xecute(SQLHSTMT StatementHandle);StatementHandle必須是已經(jīng)預處理過的語句句柄ODBC API(9)- SQLBindParameterl SQLRETURN SQLBindParameter( SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber, SQLSMALLINT InputOutputType, SQLSMALLINT ValueType, SQLSMALLINT ParameterType, SQLUINTEGER ColumnSize, SQLSMALLINT DecimalD

20、igits, SQLPOINTER ParameterValuePtr, SQLINTEGER BufferLength, SQLINTEGER * StrLen_or_IndPtr);ODBC API(9)- SQLBindParameterlStatementHandle:執(zhí)行SQL語句STMT句柄。lParameterNumber:指明要將變量與第幾個參數(shù)綁定,從1開始計算。lInputOutputType:指明是輸入還是輸出參數(shù)。可以取值的范圍為:SQL_PARAM_INPUT,SQL_PARAM_OUTPUT ,SQL_PARAM_INPUT_OUTPUT。lValueType:指明用于和參數(shù)綁定的C語言數(shù)據(jù)類型。lParameterType:指明在存儲過程中ODBC數(shù)據(jù)類型。lColumnSize:指明接收數(shù)據(jù)的寬度,對于字符串和結(jié)構(gòu)需要指明數(shù)據(jù)的寬度,而對于普通的變量如SQLINTEGER,SQLFLOAT等設(shè)置為0就可以了。lDecimalDigits :當數(shù)據(jù)類型為SQL_NUMERIC,SQL_DECIMAL時指明數(shù)字小數(shù)點的精度,否則填0。lParameterValuePtr:在作為輸入?yún)?shù)指明參數(shù)的指針,在作為輸出參數(shù)時指明接收數(shù)據(jù)的變量指針。lBufferLength:指明參數(shù)指針所指向的緩

溫馨提示

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

最新文檔

評論

0/150

提交評論