2018-03-11
C++连接数据库(ODBC/win32编程)
关于sqlServer中的一些内容补充:(1)若登录时无法连接到数据库,则需要开启服务. 控制面版-〉管理工具-〉服务-〉sqlserver服务右键,开启服务
(2)需要到系统的管理工具-〉ODBC数据数据源,双击打开后添加SQLSERVER服务(需要选择你要连接的表)
(3)代码中填入的DSUSERNAME、DSUSERNAME 对应数据库的账号密码
操作数据库主要代码如下:
// sqltest.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include//ODBC 访问数据库#include#include//库
#pragma comment(lib, "odbc32.lib")
#define DSNAME "StuDs"
#define DSUSERNAME "dy"
#define DSUSERNAME "dy"
bool CheckError(SQLRETURN ret, char *pStr);
int main(int argc, char* argv[])
{
//分配环境句柄 (准备驱动)
SQLRETURN ret; //所有ODBC的api返回值类型
SQLHENV henv; //环境句柄
ret= SQLAllocEnv(&henv);
CheckError(ret, "分配环境句柄");
//连接 数据源
//分配连接句柄
SQLHDBC hdbc;
ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
CheckError(ret, "分配连接句柄");
//连接数据源
ret = SQLConnect(hdbc, (SQLCHAR*)DSNAME, strlen(DSNAME), (SQLCHAR*)DSUSERNAME, strlen(DSUSERNAME),
(SQLCHAR*)DSUSERPWD, strlen(DSUSERPWD));
CheckError(ret, "连接数据源");
//准备执行sql语句
//1.直接执行sql
//2.先准备sql语句,之后在执行 (对于一些执行比较频繁的sql语句,一般采用这种方式)
//分配语句句柄
SQLHSTMT hstmt;
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
CheckError(ret, "分配语句句柄");
//修改游标类型,让它可以上下移动,绝对定义
SQLSetStmtOption(hstmt, SQL_ATTR_CURSOR_TYPE, SQL_CURSOR_KEYSET_DRIVEN);
//直接执行sql语句
/*ret = SQLExecDirect(hstmt, (SQLCHAR*)"insert into students values('毛毛虫', 10013, '地址不详',\
12.3, 'xxx@xx.xx', 23)", SQL_NTS);
CheckError(ret, "执行SQL语句");
*/
/*
SQLPrepare(hstmt, (SQLCHAR*)"insert into students values('小花猫', 10014, '地址不详',\
22.3, 'xxx@xx.xx', 25)", SQL_NTS);
ret = SQLExecute(hstmt);
CheckError(ret, "执行SQL语句");
*/
SQLExecDirect(hstmt, (SQLCHAR*)"select * from students", SQL_NTS);
/*
//1
//游标
SQLFetch(hstmt); //向下移动游标
//获取结果集
SQLCHAR name[32];
SQLINTEGER len = 0, id = 0;
SQLGetData(hstmt, 1, SQL_C_CHAR, name, 32, &len );
SQLGetData(hstmt, 2, SQL_C_LONG, &id, 4, &len );
printf("%s\t%d\t%d\n", name, id, len);
*/
//2
//通过绑定列的方式
SQLCHAR name[32];
SQLINTEGER len = 0, id = 0;
SQLBindCol(hstmt, 1, SQL_C_CHAR, name, 32, &len);
SQLBindCol(hstmt, 2, SQL_C_LONG, &id, 4, &len );
ret = SQLFetchScroll(hstmt, SQL_FETCH_NEXT, 0);
while(ret != SQL_NO_DATA)
{
printf("%s\t%d\n", name, id);
ret = SQLFetchScroll(hstmt, SQL_FETCH_NEXT, 0);
}
SQLCancel(hstmt); //清理结果集,以便后续再次使用语句句柄
//SQLFetchScroll(hstmt, SQL_FETCH_PRIOR, 0);
// printf("%s\t%d\n", name, id);
//释放句柄,断开连接
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}
bool CheckError(SQLRETURN ret, char *pStr)
{
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
{
printf("%s 失败\n", pStr);
exit(-1);
return false;
}
return true;
}