ODBC+C/C++ 数据库操作
来源:互联网 发布:安卓看电影软件 编辑:程序博客网 时间:2024/05/16 18:44
什么是ODBC
ODBC(Open Database Connectivity) 是一个数据库的API接口,可以使C/C++程序调用连接数据库,通过SQL语句对数据库进行操作。
ODBC怎么用
环境:
vs2013+sqlserver2012-c/c++
- 配置系统数据源
控制面板-管理工具-32位(或64位)ODBC数据源-系统DSN-新建
注意:使用网络登陆ID的Windows NT验证
我在这里遇到了很大BUG,导致后面连接数据库总是连不上。
- 连接数据库
#include <iostream>
#include <windows.h>
#include "sqlext.h"
using namespace std;
SQLHENV henv; //环境句柄
SQLHDBC hdbc; //连接句柄
SQLHSTMT hstmt; //语句句柄
SQLRETURN retcode; //返回值
/*用ODBC API访问数据库:连接数据库*/
SQLINTEGER cb1 = 0, cb2 = SQL_NTS;
void InsertOneBook();
void test();
int CheckStock(char* bookid);
int main(){
/*分配环境句柄*/
retcode =SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (retcode == SQL_SUCCESS|| retcode == SQL_SUCCESS_WITH_INFO){
/*设置ODBC环境属性*///OK
retcode =SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
if (retcode ==SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
/*分配连接句柄*/ //ok
retcode =SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (retcode ==SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
/*连接到数据源*/ //ok
retcode =SQLConnect(hdbc, (SQLCHAR*)"sqlding", SQL_NTS,(SQLCHAR*)"sa", SQL_NTS, (SQLCHAR*)"1234", SQL_NTS);
//cout<< retcode << endl;
if (retcode ==SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
/*分配语句句柄*/
retcode =SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
/*处理数据*/
//这里是操作
cout<< "ok" << endl;
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
SQLDisconnect(hdbc);
}
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
}
}
return 0;
}
- 相关函数及操作
- 查询
query =“select……”
再用SQLExecDirect函数执行query语句
插入(带参数) ——准备-执行
query="insert……?"参数处用?代替
准备-使用SQLPrepare函数
绑定参数-使用SQLBindParameter函数
执行-使用SQLExecute函数
带参数的另一种解决办法
使用strcat字符串拼接
- 查错
SQL的函数会返回一个SQLRETURN的值(假设赋给retcode),根据retcode的值可以判断是否执行成功
如果失败,可以使用下面这段代码查错
SQLCHARSqlState[6], SQLStmt[100], Msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER NativeError;
SQLSMALLINT i, MsgLen;
i = 1;
while ((retcode =SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, i, SqlState, &NativeError, Msg,sizeof(Msg), &MsgLen)) != SQL_NO_DATA)
{
printf("%s\n",SqlState);
i++;
}
其中SqlState里存放的是错误的序列号,Msg里存放的是错误的内容
4.其他注意事项
- 每一次调用SQL函数前后都需要以下语句
retcode =SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
- 注意SQL、ODBC、C间的数据转化
注意SQL_C_FLOAT和SQL_FLOAT不一样(一个是6一个是7)
- 注意绑定参数的时候的数组大小
- ODBC+C/C++ 数据库操作
- C语言ODBC数据库操作
- C语言ODBC数据库操作
- C语言ODBC操作MySQL数据库
- C++ODBC连接数据库
- C++ODBC连接数据库
- ODBC-C语言操作数据库(SQL Server 2000)(上)
- ODBC-C语言操作数据库(SQL Server 2000)(下)
- C语言ODBC操作数据库遇到的一些问题
- C语言通过ODBC操作数据库源码模板
- 使用ODBC连接数据库[C++]
- ODBC C编程访问数据库
- c语言数据库编程--ODBC
- c语言ODBC连接数据库
- 通过odbc,c#连接pg数据库
- ODBC连数据库代码 - C接口 - 备忘
- C API 通过ODBC 连接数据库MYSQL
- C API 通过ODBC 连接数据库MYSQL
- 如何在Ubuntu QML应用中实现一个垂直的Slider
- GCDAsyncSocket接受数据丢包的问题
- 我用DW也有几年了,真不知道你说的这些代码是什么?不是快捷键吧?
- sax、dom、pull解析xml
- Android图片的选取和拍照
- ODBC+C/C++ 数据库操作
- 有理想的程序员必须知道的15件事
- 安装Package Control
- UIAlertController
- delphi 判断字符串有中文
- 解决bug:Android 更换新logo图标后,运行项目图标没有变化——诺诺"涂鸦"记忆
- Eclipse快捷键
- 做个正能量的程序员
- jQuery实现 全选/反选