美文网首页
2018-03-11

2018-03-11

作者: 黄文俊_ | 来源:发表于2018-03-12 18:59 被阅读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;

    }

    相关文章

      网友评论

          本文标题:2018-03-11

          本文链接:https://www.haomeiwen.com/subject/skcgfftx.html