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*,但是主要是为了区分各种句柄类型。

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