数据库连接断开与释放
在应用完成对数据库的操作后,需进行断开连接和释放资源操作。如连接使用后不与服务端断开,则会影响其它新建连接服务。如客户端申请资源不释放则会影响应用后续资源申请。连接的释放对于应用的长期稳定运行有极重要的作用。
频繁的建连接,旧资源得不到释放,将极大地影响后续应用的使用体验。连接的释放主要分为以下步骤:
- 在有语句句柄的情况下先释放语句句柄
- 断开连接
- 释放连接句柄
- 释放环境句柄
操作流程图如图1所示。

此段程序的C代码示例如下:
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; /* 连接句柄 */
SQLHSTMT hstmt; /* 语句句柄 */
SQLRETURN ret; /* 返回代码 */
SQLINTEGER autocommit_mode;
/* 申请一个环境句柄 */
SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
/* 设置环境句柄的 ODBC 版本 */
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
/* 申请一个连接句柄 */
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
ret = SQLConnect(hdbc, (SQLCHAR *)"XuguDB", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS);
if (RC_NOTSUCCESSFUL(ret)) {
/* 连接数据源失败! */
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return;
}
/* 设置连接句柄属性,关闭自动提交功能 */
SQLSetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER);
/* 取得连接句柄属性,取得提交的模式 */
SQLGetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)&autocommit_mode, sizeof(SQLINTEGER), NULL);
/* 申请一个语句句柄 */
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
...在这里可以使用语句句柄进行相应的数据库操作...
/* 释放语句句柄 */
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
/* 提交连接上的事务 */
SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
/* 断开与数据源之间的连接 */
SQLDisconnect(hdbc);
/* 释放连接句柄 */
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
/* 释放环境句柄 */
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}