C++ Access控制台程序SQL执行成功后如何获取查询结果?
解决ODBC获取Access查询结果的问题
你的代码仅完成了数据库连接与查询执行,要获取返回的结果集,需要通过列绑定和逐行提取的步骤实现,具体操作如下:
核心操作步骤
- 获取结果集元数据:用
SQLNumResultCols获取列总数,SQLDescribeCol可查询每列的名称、数据类型等细节 - 绑定列到程序变量:通过
SQLBindCol将数据库列与C++变量关联,实现数据映射 - 循环提取数据行:用
SQLFetch逐行读取结果,直到返回SQL_NO_DATA表示无更多数据
修改后的完整代码示例
#include <windows.h> #include <sql.h> #include <sqlext.h> #include <stdio.h> SQLHENV hEnv = SQL_NULL_HENV; SQLHDBC hDbc = SQL_NULL_HDBC; SQLHSTMT hStmt = SQL_NULL_HSTMT; SQLRETURN rc; WCHAR szDSN[] = L"你的Access数据源名称"; WCHAR szConnStrOut[256]; SQLSMALLINT iConnStrLength2Ptr; WCHAR query[] = L"SELECT * FROM 你的目标表名"; // 替换为实际查询语句 int bdacess(int argc, char* argv[]) { /* Allocate an environment handle */ rc = SQLAllocEnv(&hEnv); /* Allocate a connection handle */ rc = SQLAllocConnect(hEnv, &hDbc); /* Connect to the database */ rc = SQLDriverConnect(hDbc, NULL, szDSN, SQL_NTS, szConnStrOut, 255, &iConnStrLength2Ptr, SQL_DRIVER_NOPROMPT); if (SQL_SUCCEEDED(rc)) { wprintf(L"Successfully connected to database. Data source name: \n %s\n", szConnStrOut); /* Prepare SQL query */ wprintf(L"SQL query:\n %s\n", query); rc = SQLAllocStmt(hDbc, &hStmt); rc = SQLPrepare(hStmt, query, SQL_NTS); /* Execute the query */ rc = SQLExecute(hStmt); if (SQL_SUCCEEDED(rc)) { wprintf(L"SQL Success\n"); // ---------------------- 新增:结果集处理逻辑 ---------------------- SQLSMALLINT colCount; // 获取结果集列数 rc = SQLNumResultCols(hStmt, &colCount); if (SQL_SUCCEEDED(rc)) { wprintf(L"结果集共 %d 列\n", colCount); // 示例:处理字符串类型列,可根据实际列类型调整变量类型 WCHAR col1Value[256]; SQLLEN col1Len; // 绑定第一列到变量(列索引从1开始) rc = SQLBindCol(hStmt, 1, SQL_C_WCHAR, col1Value, sizeof(col1Value)/sizeof(WCHAR), &col1Len); if (SQL_SUCCEEDED(rc)) { // 逐行读取数据 while (SQLFetch(hStmt) == SQL_SUCCESS || SQLFetch(hStmt) == SQL_SUCCESS_WITH_INFO) { // 处理空值情况 if (col1Len == SQL_NULL_DATA) { wprintf(L"第一列值:NULL\n"); } else { wprintf(L"第一列值:%s\n", col1Value); } } } else { wprintf(L"列绑定失败\n"); } } else { wprintf(L"获取列数失败\n"); } // ---------------------- 结果集处理结束 ---------------------- } else { wprintf(L"SQL Failed\n"); } } else { wprintf(L"Couldn't connect to %s.\n", szDSN); } /* 释放资源:先释放语句句柄,再断开连接 */ if (hStmt != SQL_NULL_HSTMT) SQLFreeHandle(SQL_HANDLE_STMT, hStmt); SQLDisconnect(hDbc); SQLFreeHandle(SQL_HANDLE_DBC, hDbc); SQLFreeHandle(SQL_HANDLE_ENV, hEnv); getchar(); return 0; }
关键细节说明
- 列索引规则:ODBC中列的索引从1开始,而非0
- 数据类型匹配:
SQLBindCol的第三个参数需与数据库列类型对应,比如Access文本列用SQL_C_WCHAR,整数列用SQL_C_LONG - 空值判断:通过
SQLLEN类型的长度变量判断是否为SQL_NULL_DATA - 多列处理:若查询返回多列,需循环调用
SQLBindCol为每列绑定对应变量,再在SQLFetch后依次处理
内容的提问来源于stack exchange,提问作者Evgenii
相关产品推荐
相关产品推荐

