C++数据库编程 ODBC查询数据
2021/5/1 19:27:18
本文主要是介绍C++数据库编程 ODBC查询数据,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 1. 步骤
- 2. 示例代码
1. 步骤
- 分配语句句柄
根据连接句柄分配语句句柄。
//分配语句句柄 SQLHSTMT hStmt = NULL; ret = SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
- 执行SQL语句
SQLEXecDirect执行已准备SQ语句,SQLEXecDirect是提交SQL语句一次执行的最快方法。
//SQL查询语句 SQLTCHAR sql[] = _T("SELECT * FROM Student "); //执行SQL语句 ret = SQLExecDirect(hStmt,sql,SQL_NTS); //SQL_NTS自动计算sql语句的长度
- 绑定结果集的列
SQLBindcol将应用程序数据缓冲区绑定到结果集中的列。
//绑定字段 SQLLEN len = SQL_NTS; SQLBindCol(hStmt, 1, SQL_C_LONG, &id, sizeof(id), 0); SQLBindCol(hStmt, 2, /*SQL_C_CHAR*/SQL_C_WCHAR, name, sizeof(name), &len); SQLBindCol(hStmt, 3, SQL_C_SHORT, &age, sizeof(age), 0);
- 遍历结果集
SQLFetch从结果集中获取数据的下一个行集,并返回所有绑定列的数据。
//逐行遍历,获取数据 ret = SQLFetch(hStmt); while (ret != SQL_NO_DATA) { wcout << id << "\t" << name << "\t" << age << endl; //每次清除一下上行的旧数据,保证下次获取的数据干净 id = 0; ZeroMemory(name, sizeof(name)); age = 0; //获取下一行缓冲区的数据填充到id,name,age ret = SQLFetch(hStmt); }
2. 示例代码
//包含头文件 #include<Windows.h> #include <sql.h> #include <sqlext.h> #include<sqltypes.h> #include <tchar.h> #include <iostream> using namespace std; int main() { //设置为中文 _wsetlocale(LC_ALL, L"chs"); SQLRETURN ret = SQL_ERROR; //分配ODBC环境句柄 SQLHENV hEnv = NULL; ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv); if (SQL_SUCCESS == ret) { wcout << _T("环境句柄分配成功!") << endl; } else { return -1; } //设定ODBC的版本 ret = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); //分配数据库连接句柄 SQLHDBC hDbc = NULL; ret = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc); //根据DSN ,连接数据库 ret = SQLConnect(hDbc, (SQLTCHAR*)_T("SQLServerODBC"), SQL_NTS, (SQLTCHAR*)_T("sa"), SQL_NTS, (SQLTCHAR*)_T("Sa123"), SQL_NTS); if ((ret == SQL_SUCCESS) || (ret == SQL_SUCCESS_WITH_INFO)) { wcout << _T("数据库连接成功!") << endl; } else if (ret == SQL_ERROR) { SQLTCHAR state[128] = { 0 }; SQLTCHAR msg[128] = { 0 }; //获取错误信息 ret = SQLError(hEnv, hDbc, NULL, state, NULL, msg, sizeof(msg), NULL); wcout << state << " " << msg << endl; } / //插入数据 //分配语句句柄 SQLHSTMT hStmt = NULL; ret = SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt); //SQL查询语句 SQLTCHAR sql[] = _T("SELECT * FROM Student "); //执行SQL语句 ret = SQLExecDirect(hStmt,sql,SQL_NTS); //SQL_NTS自动计算sql语句的长度 if ((ret == SQL_SUCCESS) || (ret == SQL_SUCCESS_WITH_INFO)) { //查询之后,所有数据放到了一块缓冲区,我们需要把他分离出来 int id = 0; TCHAR name[32] = { 0 }; short age = 0; //绑定字段 SQLLEN len = SQL_NTS; SQLBindCol(hStmt, 1, SQL_C_LONG, &id, sizeof(id), 0); SQLBindCol(hStmt, 2, /*SQL_C_CHAR*/SQL_C_WCHAR, name, sizeof(name), &len); SQLBindCol(hStmt, 3, SQL_C_SHORT, &age, sizeof(age), 0); //逐行遍历,获取数据 ret = SQLFetch(hStmt); while (ret != SQL_NO_DATA) { wcout << id << "\t" << name << "\t" << age << endl; //每次清除一下上行的旧数据,保证下次获取的数据干净 id = 0; ZeroMemory(name, sizeof(name)); age = 0; //获取下一行缓冲区的数据填充到id,name,age ret = SQLFetch(hStmt); } SQLLEN n = 0; ret = SQLRowCount(hStmt, &n);//查询被影响的行数(适用于SELECT ,INSERT,UPDATE,DELETE操作) if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) { _tprintf(_T("查询%d行数据成功!\n"), n); } } else if (ret == SQL_ERROR) { SQLTCHAR state[128] = { 0 }; SQLTCHAR msg[128] = { 0 }; //获取错误信息,注意填写语句句柄 ret = SQLError(hEnv, hDbc, hStmt, state, NULL, msg, sizeof(msg), NULL); wcout << state << " " << msg << endl; } //释放语句句柄 if (hStmt) { ret = SQLFreeHandle(SQL_HANDLE_STMT, hStmt); } // //关闭数据库连接 ret = SQLDisconnect(hDbc); if (ret == SQL_SUCCESS) { wcout << _T("关闭数据库连接成功!") << endl; } //释放连接句柄 if (hDbc) { ret = SQLFreeHandle(SQL_HANDLE_DBC, hDbc); } //释放环境句柄 if (hEnv) { ret = SQLFreeHandle(SQL_HANDLE_ENV, hEnv); } return 0; }
这篇关于C++数据库编程 ODBC查询数据的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享