ODBC學習筆記(1)--句柄

ODBC應用程序的最終目的是通過ODBC API函數執行SQL語句,完成各種數據庫操作。ODBC對數據庫的訪問通過句柄來實現,

常見的四個句柄有環境句柄,連接句柄,語句句柄和描述句柄。

       環境句柄:建立應用程序與ODBC系統之間的聯繫,只有一個環境句柄。
    連接句柄:把ODBC與數據源建立起聯繫,可以有多個連接句柄。
    語句句柄:用來與SQL語句操作建立聯繫,以便執行SQL語句。ODBC應用程序中,任何一個處理SQL語句的ODBC函數都需要一個語句句柄作參數。
  環境句柄、連接句柄和語句句柄是ODBC應用程序中使用最爲頻繁的三個對象,一個應用程序只應該創建一個環境句柄,由該環境句柄實現應用程序與ODBC動態鏈接庫的連接。但在一個環境句柄下可以創建多個連接句柄,通過這些連接句柄,應用程序可以實現與多個不同數據源的連接,爲應用程序提供同時處理不同數據庫系統數據的能力。同樣,在一個連接句柄下可以申請多個語句句柄,使用這些語句句柄執行多個SQL語句。
  語句句柄的申請和釋放操作與環境句柄和連接句柄類似,下面介紹應用程序應該怎樣申請和釋放語句句柄,以及SQL語句的執行過程。圖6-19給出ODBC申請和釋放語句句柄的流程。
 1.申請語句句柄
 2.釋放語句句柄
 3.執行SQL語句

當應用程序調用SQLAllocHandle的時候,Driver Manager 或者Driver根據句柄類型創建相應的句柄對象,並且分配內存。
所有的ODBC函數都需要用到上面的句柄。Driver Manager和Driver是根據不同的句柄來區分。
Driver Manager句柄僅僅可以被Driver Manager識別和解析。
driver 的句柄也僅僅可以被driver自己識別和解析。

例如,在一個應用程序中,driver創造了一個statement handle的句柄。在調用函數SQLPrepare函數的時候,
driver會將語句句柄傳輸給數據服務器,driver會爲這個句柄做好準備,
然後當調用SQLExecute的時候,也使用相同的句柄,然後會返回相應的數據集,或者是執行結果。

在ODBC的結構中,有兩個級別的句柄,1個是driver manager 另一個是dirver的句柄。

因爲ODBC函數都在driver manager中,所以,應用程序在調用ODBC函數的時候,首先會調用driver manager中的函數,
然後driver manager會在相對應的driver中找到相應的driver handler,然後使用driver handler來調用driver中相應的函數。
在函數代碼中,如果想了解更多driver相關的信息,你可以使用接口SQLGetInfo
 

一、環境句柄:

環境句柄在全局範圍內一般只有一個。也就是一個應用程序只需要一個環境句柄。

環境句柄記錄着全局的環境信息。其中包括:
1:環境的狀態。
2:當前環境的診斷級別。 (current environment-level diagnostics)
3: 可以在環境句柄中創建連接句柄。
4:還有每個環境屬性的當前設置。

在ODBC應用程序中,環境句柄的使用並不是特別的頻繁。經常會被以下幾個接口調用。
SQLDataSources, SQLDrivers
SQLAllocHandle, SQLFreeHandle, SQLEndTran
SQLGetDiagField, SQLGetDiagRec

每個代碼段都包含1個或者多個環境句柄,
driver manager 維護不用的環境句柄,以區分不同的應用程序,
環境句柄的創建和釋放分別由SQLAllocHandle和SQLFreeHandle完成。

二、連接句柄:


連接是指driver和data source的連接,每個連接都由連接句柄來區分。
在ODBC應用程序中,連接句柄通常包含下列信息。
1:連接的狀態,
2:當前連接的診斷級別。(current connection-level diagnostics)
3: 創建和釋放【語句句柄和描述句柄】
4:當前設置的每個連接屬性。

ODBC是支持多個連接同時連接的,所以通常情況下,driver會支持多個連接同時連接。
因此在同一個ODBC應用程序中,可以有很多連接。
可以有多個driver和多個data source的多個連接。
也可以有一個driver和多個data source的多個連接。
也可以有一個driver和一個data srouce的多個連接。

不過同一個driver,有連接數量限制,可以使用SQLGetInfo 函數來獲取連接數量限制,SQL_MAX_DRIVER_CONNECTIONS 

連接句柄是的最基本的句柄,例如下列接口會調用,
連接到數據源:SQLConnect, SQLDriverConnect, SQLBrowseConnect
關閉連接:SQLDisconnect
獲取driver和數據源的信息:SQLGetInfo
診斷信息:SQLGetDiagField, SQLGetDiagRec
執行事務:SQLEndTran
設置或獲取連接屬性:SQLSetConnectAttr, SQLGetConnectAttr
獲取本機格式的接口:SQLNativeSql

創建: SQLAllocHandle
釋放: SQLFreeHandle

三、語句句柄:

語句句柄不僅僅包含sql語句,還包含和此sql語句所關聯的所有信息,
例如返回的結果集,和執行語句的參數,
甚至於有些地方都不需要的sql語句,例如SQLTables,會使用預先定義的sql語句直接獲取所有表的名字。


不同的語句是有語句句柄區別的。 一個語句僅僅屬於一個連接,但是一個連接可以有多個語句句柄。

同一個連接會限制語句句柄的數量, 限制的數量是SQLGetInfo接口來獲取,其中參數爲SQL_MAX_CONCURRENT_ACTIVITIES


當通過sql語句 INSERT UPDATE DELETE關鍵字的sql語句,statement會返回行數,
這時 語句句柄就會處於激活狀態。
當使用接口SQLPutData多次發送數據的時候,語句句柄也會處於激活狀態。

在ODBC應用程序中,語句句柄通常包含下列信息:
1:語句的狀態。
2:當前語句的診斷級別。
3:綁定到語句的參數和結果集合的地址。
3:當前的語句設置。

有很多的ODBC函數都會使用語句句柄。    
1:綁定參數和綁定列。 SQLBindParameter,SQLBindCol
2: 執行SQL語句:SQLPrepare, SQLExecute, SQLExecDirect
3: 獲取列屬性(檢索元數據):SQLColAttribute, SQLDescribeCol
4:匹配結果: SQLFetch
5:診斷信息:SQLGetDiagField, SQLGetDiagRec
6: 目錄的函數:SQLColumns, SQLTables
7:創建和釋放:SQLAllocHandle, SQLFreeHandle

四、描述符句柄

描述符指的是SQL語句的參數和結果集的列的元數據的集合。一般擔任下面四個角色的任意一個角色。
1:應用程序參數描述符(APD):C數據類型:例如地址,長度和C數據類型。
包含有關綁定到 SQL 語句中的參數的應用程序緩衝區的信息。
2:實現參數描述符(IPD):SQL 數據類型:SQL數據和長度或者 null 。
3:應用程序行描述符(ARD):包含有關綁定到結果集中的列的應用程序緩衝區的信息。
4:實現行描述符(IRD):包含有關結果集中的列的信息

自動分配的描述符:創建語句句柄的時候,會自動創建四個描述符,對應上面四個類型。
自動分配的描述符,始終和語句相關聯。

顯式分配的描述符:應用程序還可以使用SQLAllocHandle在連接上創建新的描述符,
並且可以與該連接上的一個或者多個語句相關聯,滿足ARD 和 APD的角色。

ODBC中,大多數操作都不需要顯示創建描述符,但是某些操作可能爲了方便快捷。例如:
某個應用程序要從兩個不同的緩衝區集中插入數據。若要使用第一組緩衝區,需要
重複調用SQLBindParameter將其綁定到INSERT語句中的參數,然後執行該語句
 

五、狀態轉換

每種句柄都有多個狀態。例如環境句柄的狀態有三種情況:
1:Unallocated (沒有分配內存)
2:Allocated   (已經分配了內存,但是還沒有任何連接)
3:Connection     (已經分配了內存,並且有一個或者多個連接)

連接句柄有7個狀態。
語句句柄有13個狀態。

狀態1->狀態2  SQLAllocHandle
狀態2->狀態3  SQLAllocHandle
狀態2->狀態1  SQLFreeHandle
狀態3->狀態1 SQLDisconnect,SQLFreeHandle


環境句柄的三個狀態的轉換,使用SQLAllocHandle, SQLFreeHandle 來完成,
狀態轉換需要特定的函數順序。

但是例如這種函數,不需要特定的函數順序。例如:SQLGetConnectAttr

,如果環境句柄處於狀態3,那麼直接調用函數SQLFreeHandle的話,會導致釋放失敗。
也就是錯誤碼SQLSTATE HY010 : 也就是函數調用順序錯誤。
因爲狀態3到狀態1,必須先關閉連接,進入狀態2,然後才能釋放。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章