ODBC學習筆記(2)--SQLAllocHandle,SQLFreeHandle

該函數就是用來分配句柄的,句柄類型參考參數詳解。

SQLRETURN SQLAllocHandle(  
      SQLSMALLINT   HandleType,  
      SQLHANDLE     InputHandle,  
      SQLHANDLE *   OutputHandlePtr);

參數:

參數1 HandleType:是需要分配的句柄的類型,

SQL_HANDLE_ENV:用於申請環境句柄
SQL_HANDLE_DBC :用於申請連接句柄

SQL_HANDLE_STMT:用於申請語句句柄
SQL_HANDLE_DESC:用於申請描述符句柄

參數2 InputHandle: 是指分配的句柄在什麼句柄之上,例如連接句柄,需要在環境句柄之上。

該變量放入已經被分配好的前提句柄,如果第一個變量爲環境句柄,則放入SQL_NULL_HANDLE即可,若果第一個變量爲SQL_HANDLE_DBC,則第二個變量必須爲已分配的環境句柄,如第一個變量爲SQL_HANDLE_DESC,SQL_HANDLE_STMT則,第二個變量必須爲已分配好的連接句柄。

參數3 OutputHandlePtr: 分配好的句柄,

返回值,通用的返回值,可以查看時候分配內存成功。

返回值:

返回值有四種:SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_INVALID_HANDLE, or SQL_ERROR.

查看詳細錯誤信息可調用SQLGetDiagRec 函數(之後章節講解)。

用法:


void GBaseODBC::test_AllocHandle()
{
    SQLHENV  henv = NULL;
    SQLHDBC  hdbc = NULL;
    SQLHSTMT hstmt = NULL;
    SQLHDESC hdesc = NULL;

    SQLRETURN rs = 0;   //使用指針的初始化


    // 申請環境句柄。
    rs = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
    rs = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);

    // 基於henv這個環境,申請連接句柄。
    rs = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
    rs = SQLConnect(hdbc, (SQLCHAR*)"80.129", SQL_NTS, (SQLCHAR*)"sysdba", SQL_NTS, (SQLCHAR*)"******", SQL_NTS);

    // 基於hdbc這個連接,申請語句句柄。
    rs = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

    // 基於hdbc這個連接,申請描述句柄。
    rs = SQLAllocHandle(SQL_HANDLE_DESC, hdbc, &hdesc);


    //SQLFreeHandle 如果釋放函數的返回結果爲失敗,則這個句柄仍然有效。

    // 釋放語句句柄,
    rs = SQLFreeHandle(SQL_HANDLE_STMT, &hstmt);
    // 關閉連接。
    rs = SQLDisconnect(hdbc);
    // 釋放連接句柄,在釋放之前需要先關閉連接。否則釋放失敗。
    rs = SQLFreeHandle(SQL_HANDLE_DBC, &hdbc);


    // 釋放環境句柄。如果這個環境被多個(組件)共享,那麼釋放僅僅是減少其引用計數。
    // 其中引用計數是由驅動管理器來管理。如果引用計數沒有減少爲0,那麼環境句柄並不會真正的被釋放。
    // 
    rs = SQLFreeHandle(SQL_HANDLE_ENV, &henv);
}

SQLConnect接口會在後面章節中詳細解釋。

 

SQLHENV;
SQLHDBC;
SQLHSTMT;
SQLHDESC;
雖然都是void*,但是主要是爲了區分各種句柄類型。

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