1. VC++环境下ODBC编程基础
在Windows平台开发中,VC++与ODBC的结合使用是处理数据库访问的经典方案。ODBC(Open Database Connectivity)作为微软提出的数据库访问标准,其最大优势在于提供了一套统一的API接口,使得开发者可以用相同的方式访问不同类型的数据库。
1.1 ODBC环境初始化
要使用ODBC进行数据库编程,首先需要初始化ODBC环境。这个过程包括三个关键步骤:
- 分配环境句柄(SQLHENV)
- 设置ODBC版本属性
- 分配连接句柄(SQLHDBC)
cpp复制SQLHENV hEnv = NULL;
SQLHDBC hDbc = NULL;
SQLRETURN ret;
// 分配环境句柄
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
// 错误处理
}
// 设置ODBC版本
ret = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
// 错误处理
}
// 分配连接句柄
ret = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
// 错误处理
}
注意:环境句柄是整个ODBC操作的基础,一个应用程序通常只需要一个环境句柄,但可以有多个连接句柄。在程序退出前,必须确保释放所有分配的资源。
1.2 数据库连接管理
建立数据库连接是ODBC编程的核心操作之一。连接数据库通常有两种方式:
- 使用预配置的数据源名称(DSN)
- 直接使用连接字符串
cpp复制// 使用DSN连接
ret = SQLConnect(hDbc, (SQLCHAR*)"MyDataSource", SQL_NTS,
(SQLCHAR*)"username", SQL_NTS,
(SQLCHAR*)"password", SQL_NTS);
// 或者使用连接字符串
ret = SQLDriverConnect(hDbc, NULL,
(SQLCHAR*)"DRIVER={SQL Server};SERVER=myserver;DATABASE=mydb;UID=user;PWD=password;",
SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT);
在实际项目中,我推荐使用连接字符串的方式,因为它更灵活且不需要预先配置DSN。特别是在需要部署到多台机器时,可以避免每台机器都要配置DSN的麻烦。
1.3 执行SQL语句
ODBC执行SQL语句主要有两种方式:
- 直接执行(SQLExecDirect)
- 准备后执行(SQLPrepare + SQLExecute)
对于简单的、一次性执行的SQL语句,使用SQLExecDirect更简便:
cpp复制SQLHSTMT hStmt;
ret = SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
ret = SQLExecDirect(hStmt, (SQLCHAR*)"SELECT * FROM Employees", SQL_NTS);
对于需要多次执行的SQL语句(特别是带参数的语句),使用准备执行的方式效率更高:
cpp复制SQLHSTMT hStmt;
ret = SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
ret = SQLPrepare(hStmt, (SQLCHAR*)"INSERT INTO Employees (Name, Age) VALUES (?, ?)", SQL_NTS);
// 绑定参数
SQLCHAR name[50] = "John Doe";
SQLINTEGER age = 30;
ret = SQLBindParameter(hStmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 50, 0, name, 0, NULL);
ret = SQLBindParameter(hStmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &age, 0, NULL);
// 执行
ret = SQLExe
