首页 / C++ / C++数据库编程 ODBC查询数据
C++数据库编程 ODBC查询数据
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++数据库编程 ODBC查询数据,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3783字,纯文字阅读大概需要6分钟。
内容图文
![C++数据库编程 ODBC查询数据](/upload/InfoBanner/zyjiaocheng/858/beccb70fcd6845079c2b33dd8f9da921.jpg)
文章目录
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查询数据全部内容,希望文章能够帮你解决C++数据库编程 ODBC查询数据所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。