zoukankan      html  css  js  c++  java
  • C++操作mysql方法总结(2)

    C++通过ODBC和通过MFC ODBC操作mysql的两种方式

    使用vs2013和64位的msql 5.6.16进行操作

    项目中使用的数据库名和表数据请参考C++操作mysql方法总结(1)中的介绍

    既然使用到了ODBC那么就要需要添加数据源了

    控制面板->管理工具->数据源->用户DSN->添加

    image

    填写相关的数据库连接配置和使用的数据库,可点击Test进行测试,查看是否成功连接,设置完成后点击OK

    其中Data Source Name即MySqlODBC我们会在连接数据库时用到

    image

    至此,数据源添加完毕

    一、通过ODBC进行操作

    开放数据库互连(Open Database Connectivity,ODBC)是微软提供的一组用于数据库访问的规范接口,多数数据库都提供了ODBC驱动

    1、新建一个空项目

    2、如果使用的mysql是64位的,需要将项目的解决方案平台由win32改成x64

    至此,相关配置全部完成

    程序代码

    main.cpp

    #include <Windows.h>
    #include <iostream>
    #include <iomanip>
    #include <sql.h>
    #include <odbcss.h>
    #include <sqlext.h>
    #define MAXBUFLEN   255 
    #define MaxNameLen  20
    
    #import "c:program filescommon filessystemadomsado15.dll" no_namespace rename("EOF", "adoEOF")
    
    SQLHENV  henv = SQL_NULL_HENV;//定义环境句柄
    SQLHDBC  hdbc1 = SQL_NULL_HDBC;//定义数据库连接句柄     
    SQLHSTMT  hstmt1 = SQL_NULL_HSTMT;//定义语句句柄
    
    using namespace std;
    int main()
    {
        RETCODE retcode;//错误返回码
        retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
        if (retcode < 0)//错误处理
        {
            cout << "allocate ODBC Environment handle errors." << endl;
            return -1;
        }
        retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
            (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
        if (retcode < 0) //错误处理
        {
            cout << "the  ODBC is not version3.0 " << endl;
            return -1;
        }
        retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
        if (retcode < 0) //错误处理
        {
            cout << "allocate ODBC connection handle errors." << endl;
            return -1;
        }
    
        char* szDSN = "MySqlODBC";//添加数据源时,为其起的名字
        char* szUID = "root";
        char* szAuthStr = "123456";
    
        retcode = SQLConnect(hdbc1,
                            (SQLCHAR*)szDSN, 
                            (SWORD)strlen(szDSN), 
                            (SQLCHAR*)szUID, 
                            (SWORD)strlen(szUID), 
                            (SQLCHAR*)
                            szAuthStr,
                            (SWORD)strlen(szAuthStr));
    
        if (retcode < 0) //错误处理
        {
            cout << "connect to  ODBC datasource errors." << endl;
            return -1;
        }
    
        retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
        if (retcode < 0) 
        {
            cout << "allocate ODBC statement handle errors." << endl;
            return -1;
        }
        retcode = SQLExecDirect(hstmt1, (SQLCHAR*)"SElECT *  FROM book", SQL_NTS);
        if (retcode < 0)
        {
            cout << "Executing statement  throught ODBC  errors." << endl;
            return -1;
        }
        SQLCHAR      bookname[MaxNameLen + 1];
        SQLCHAR         size[MaxNameLen + 1];
        SQLLEN         columnLen = 0;
    
        retcode = SQLBindCol(hstmt1, 2, SQL_C_CHAR, bookname, MaxNameLen, &columnLen);
        retcode = SQLBindCol(hstmt1, 3, SQL_C_CHAR, size, MaxNameLen, &columnLen);
        while ((retcode = SQLFetch(hstmt1)) != SQL_NO_DATA)
        {
            cout <<setw(9) <<"BookName:" << bookname << endl;
            cout << setw(9) << "Size:" << size << endl;
        }
        system("pause");
    }

    运行结果

    image

    一、通过MFC ODBC进行操作

    MFC提供了对ODBC进行了封装,使得利用MFC创建ODBC的应用程序变得简单

    1、新建一个win32的控制台应用程序

    2、进行以下修改

    MFC的使用:在共享DLL中使用MFC

    字符集:使用Unicode字符集

    image

    3、如果使用的mysql是64位的,需要将项目的解决方案平台由win32改成x64

    至此,相关配置全部完成

    程序代码

    main.cpp

    #include "stdafx.h"
    #include "afxdb.h"
    #include <iostream>
    #include <iomanip>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[])
    {
        CDatabase db;
    
        if (!db.IsOpen())//判断数据库是否已经被打开
        {
    
            BOOL bflag=     db.Open(NULL, FALSE, FALSE, _T("ODBC;DSN=MySqlODBC;UID=root;PWD=123456"));    
            if (!bflag)
            {
                cout << "ERROR" << endl;
            }
        }
    
        CRecordset rs(&db);
        CString str;
        str.Format(L"select * from book");
        try
        {
            rs.Open(CRecordset::forwardOnly, (L"%s", str));
            short nFields = rs.GetODBCFieldCount();
            while (!rs.IsEOF())
            {
    
                CDBVariant varValue;
                rs.GetFieldValue(L"bookname", varValue);
                cout << setw(9) << "BookName:" << *varValue.m_pstringA << endl;
                rs.GetFieldValue(L"size", varValue);
                cout << setw(9) << "Size:" << *varValue.m_pstringA << endl;
                rs.MoveNext();
            }
        }
        catch (...)
        {
            cout << "ERRPR" << endl;
        }
    
        db.Close();
        system("pause");
    }

    运行结果

    image

  • 相关阅读:
    ZOJ1542 POJ1861
    Codeforces Round #194 (Div. 2) 部分题解
    SRM585 div2
    hdu 4627 The Unsolvable Problem
    hdu 4622 Reincarnation
    hdu 4617 Weapon
    hdu 4609 3-idiots
    hdu 4616 Game
    hdu 4611 Balls Rearrangement
    hdu 4618 Palindrome Sub-Array
  • 原文地址:https://www.cnblogs.com/magicsoar/p/3819738.html
Copyright © 2011-2022 走看看