Skip to content

申请环境句柄与连接句柄

应用程序要和远程的数据库服务端进行通讯,须与数据库服务端建立连接。为建立ODBC数据源连接,需要使用环境句柄以及连接句柄。句柄有层次的概念,连接句柄总是和唯一的环境句柄相联系,所有的连接句柄必须在环境句柄释放之前释放。

应用程序可通过调用函数SQLAllocHandle申请环境句柄,调用函数SQLAllocHandle时必传入句柄类型SQL_HANDLE_ENV,申请环境句柄成功后,可在此环境句柄上申请连接句柄。申请环境句柄和连接句柄的示例代码如下:

c
#include <windows.h> 
#include <sql.h> 
#include <sqltypes.h> 
#include <sqlext.h> 
/* 检测返回代码是否为成功标志,当为成功标志时返回 TRUE,否则返回 FALSE */ 
#define RC_SUCCESSFUL(rc) ((rc) == SQL_SUCCESS || (rc) == SQL_SUCCESS_WITH_INFO) 
/* 检测返回代码是否为失败标志,当为失败标志时返回 TRUE,否则返回 FALSE */ 
#define RC_NOTSUCCESSFUL(rc) (!(RC_SUCCESSFUL(rc))) 
void main(void) 
{ 
    SQLHENV henv;  /* 环境句柄 */ 
    SQLHDBC hdbc;  /* 连接句柄 */ 
    SQLRETURN ret; /* 返回代码 */ 
    /* 申请一个环境句柄 */ 
    ret = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
    if(RC_NOTSUCCESSFUL(ret))
    {
        /* 环境句柄分配失败 */
        return;
    }
    /* 设置环境句柄的 ODBC 版本 */ 
    ret = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER); 
    /* 申请一个连接句柄 */
    ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 
    if(RC_NOTSUCCESSFUL(ret))
    {
        /* 连接句柄分配失败 */
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
        return;
    }
    /* 释放连接句柄 */ 
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc); 
    /* 释放环境句柄 */ 
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
}