• C++中使用ODBC API访问数据库例程(转)


    使用ODBC API访问数据库简单流程,供参考使用:

     ODBC API
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
        SQLHENV     m_hEnviroment;               //数据库环境句柄,属于老大级别的
        SQLHDBC     m_hDatabaseConnection;       //数据库连接句柄,老大以后就是他了,有了他数据库就连接上了
        SQLHSTMT    m_hStatement;                //执行语句句柄,最终执行SQL于句的句柄

         // 使用ODBC API建立数据库连接分为3部分:
         // 申请环境句柄,
         // 使用环境句柄申请连接句柄,
         // 使用连接句柄连接数据库。

         /* 申请环境变量 */
         // 申请各种句柄都靠这个函数,
         // 参数1是要申请句柄的类型,
         // 参数2为申请该句柄依靠的句柄(老大没依靠,所以是NULL),申请结果在参数3中保存
        SQLRETURN sqlReturn = SQLAllocHandle(SQL_HANDLE_ENV,  NULL , &m_hEnviroment);
         // 返回值代表着执行的意义,如下面判断,SUCCESS_WITH_INFO相当于是警告,虽然成功了,但是可能有问题
         if  (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO)
        {
             return  - 1 ;
        }
         // 设置ODBC环境属性
        SQLSetEnvAttr(m_hEnviroment, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
        
         /* 申请连接句柄 */
        sqlReturn = SQLAllocHandle(SQL_HANDLE_DBC, m_hEnviroment, &m_hDatabaseConnection);
         if  (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO)
        {
             return  - 1 ;
        }
        
         // 准备连接工作
        SQLWCHAR* sqlwcaDsnName = _T( "mysqlDB" );         //数据源名称
        SQLWCHAR* sqlwcaUserName = _T( "root" );           //用户名称
        SQLWCHAR* sqlwcaPassWord = _T( "kingview" );       //密码
         // 连接数据源
        sqlReturn = SQLConnect( m_hDatabaseConnection
                                ,sqlwcaDsnName, SQL_NTS
                                ,sqlwcaUserName, SQL_NTS
                                ,sqlwcaPassWord, SQL_NTS);

         if  (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO)
        {
             return  - 1 ;
        }

         /* 申请SQL语句句柄 */
        SQLRETURN sqlReturn = SQLAllocHandle(SQL_HANDLE_STMT, m_hDatabaseConnection, &m_hStatement);
         if  (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO)
        {
             return   0 ;
        }

         /* 构造SQL语句 */
        CString cstrSql;
        cstrSql.Format(_T( "SELECT * FROM mytable " ));
     
         /* 执行SQL语句 */
        sqlReturn = SQLExecDirect(m_hStatement, cstrSql.GetBuffer(), SQL_NTS);
         if  (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO)
        {
             return   0 ;
        }
     
         /* 获得返回结果的行数 */
        SQLINTEGER sqlnIdCount =  0 ;
        sqlReturn = SQLRowCount(m_hStatement,&sqlnIdCount);
     
         /* 开始读取结果 */
         // 读取第一行时要调用,以后依次调用就可以下移行数,直到不返回SQL_SUCCESS
        sqlReturn = SQLFetch(m_hStatement);
         if  (sqlReturn != SQL_SUCCESS && sqlReturn != SQL_SUCCESS_WITH_INFO)
        {
             return   0 ;
        }
     
        SQLINTEGER sqlnID;
        SQLINTEGER sqlnIDLength =  0 ;
     
         /* 获得数据 */
        SQLGetData(m_hStatement,  1 , SQL_C_ULONG, &sqlnID,  0 , &sqlnIDLength);
         // 参数1为执行语句的句柄,
         // 参数2为所要得到的数据位于的列数(SQL语句中),
         // 参数3为数据类型,这个比较多,需要看一下MSDN
         // 参数4为保存的位置(地址),
         // 参数5为参数4可用的位置,既然参数3已设定为长整型,所以这里可使用0
         // 参数6为实际返回的长度

         // 释放句柄,断开连接
        SQLFreeHandle(SQL_HANDLE_STMT, m_hStatement);
        SQLFreeHandle(SQL_HANDLE_DBC, m_hDatabaseConnection);
        SQLFreeHandle(SQL_HANDLE_ENV, m_hEnviroment);
     
    https://blog.csdn.net/weixin_34293246/article/details/86013541?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242
  • 相关阅读:
    网络编程- struct模块定制报头ftp实践(九)
    网络编程- strcuct模块定制报头的理论(八)
    SQL查询原理及执行顺序
    web应用的组成结构
    web开发相关知识介绍
    java--调整JVM内存的大小
    java中的泛型系列五:自定义泛型
    java中的反射技术系列四:反射类的字段
    Android Sharedpreference
    Android OnScrollListener
  • 原文地址:https://www.cnblogs.com/xihong2014/p/15303646.html
Copyright © 2020-2023  润新知