2018-03-11

2018-03-12  本文已影响0人  黄文俊_

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;

}

上一篇下一篇

猜你喜欢

热点阅读