ODBC+C/C++ 数据库操作

来源:互联网 发布:安卓看电影软件 编辑:程序博客网 时间:2024/05/16 18:44


 什么是ODBC

ODBC(Open Database Connectivity) 是一个数据库的API接口,可以使C/C++程序调用连接数据库,通过SQL语句对数据库进行操作。


 ODBC怎么用


环境:

vs2013+sqlserver2012-c/c++

 

  1. 配置系统数据源

控制面板-管理工具-32位(或64位)ODBC数据源-系统DSN-新建

注意:使用网络登陆IDWindows NT验证

我在这里遇到了很大BUG,导致后面连接数据库总是连不上。

  1. 连接数据库

#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;

}

 

  1. 相关函数及操作
    1. 查询

query =select……”

再用SQLExecDirect函数执行query语句

插入(带参数) ——准备-执行

query="insert……?"参数处用?代替

准备-使用SQLPrepare函数

绑定参数-使用SQLBindParameter函数

执行-使用SQLExecute函数

 

带参数的另一种解决办法

使用strcat字符串拼接

  1. 查错

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.其他注意事项

 

  1.  每一次调用SQL函数前后都需要以下语句  

  retcode =SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

 SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

 

  1. 注意SQLODBCC间的数据转化

注意SQL_C_FLOATSQL_FLOAT不一样(一个是6一个是7

 

  1. 注意绑定参数的时候的数组大小

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击