C++通過ODBC和通過MFC ODBC操作mysql的兩種方式
使用vs2013和64位的msql 5.6.16進行操作
項目中使用的數據庫名和表數據請參考C++操作mysql方法總結(1)中的介紹
既然使用到了ODBC那么就要需要添加數據源了
控制面板->管理工具->數據源->用戶DSN->添加
填寫相關的數據庫連接配置和使用的數據庫,可點擊Test進行測試,查看是否成功連接,設置完成后點擊OK
其中Data Source Name即MySqlODBC我們會在連接數據庫時用到
至此,數據源添加完畢
一、通過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"); }
運行結果
一、通過MFC ODBC進行操作
MFC提供了對ODBC進行了封裝,使得利用MFC創建ODBC的應用程序變得簡單
1、新建一個win32的控制台應用程序
2、進行以下修改
MFC的使用:在共享DLL中使用MFC
字符集:使用Unicode字符集
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"); }
運行結果