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 files\common files\system\ado\msado15.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM