VS中MFC访问MySQL的方法
下面進行設置:
(1)項目—>屬性—>配置屬性—>C/C++—>附加包含目錄:在附加包含目錄中添加C:\Program Files\MySQL\MySQL Server 5.7\include(就是安裝MySql下的include文件夾,將頭文件包含)
(2)項目—>屬性—>配置屬性—>連接器—>常規—>附加庫目錄:C:\Program Files\MySQL\MySQLServer 5.7\lib(就是安裝MySql下的lib文件夾,將庫文件包含)
(3)連接器—>輸入—>附加依賴項:添加libmysql.lib(若此處不添加,需要最后在頭文件中添加#pragmacomment(lib,"libmysql.lib")?)。
(4)編譯通過之后,運行還要將C:\Program Files\MySQL\MySQLServer 5.7\lib(安裝MySql下的lib文件夾)中的libmysql.dll拷到項目中的Debug文件夾中(或者拷到C:\Windows\System32中)。
下面在項目頭文件或者要連接數據庫的文件程序中添加頭文件:
#include "winsock.h" #include "mysql.h" #include <vector> #pragma comment(lib,"libmysql.lib")// (若未進行上面第(3)步設置,需要添加) void CtestDlg::OnBnClickedButton1() {// TODO: 在此添加控件通知處理程序代碼MYSQL m_sqlCon;MYSQL_RES* m_res; //查詢的返回結果集MYSQL_ROW m_row; //獲取每一條記錄mysql_init(&m_sqlCon);// localhost:服務器 root/123456為賬號密碼 managesystemdb為數據庫名 3306為端口 if (!mysql_real_connect(&m_sqlCon, "localhost", "root", "root", "mydb", 3306, NULL, 0)){AfxMessageBox(_T("訪問數據庫失敗!"));CString e = mysql_error(&m_sqlCon);//需要將項目屬性中字符集修改為“使用多字節字符集”或“未設置” MessageBox(e);return;}else{mysql_query(&m_sqlCon, "SET NAMES 'UTF-8'");//解決從數據庫中讀取數據后漢字亂碼顯示的問題 //查詢數據if (mysql_query(&m_sqlCon, "select * from user"))return ;//獲取結果集m_res = mysql_store_result(&m_sqlCon);//獲取記錄std::vector<std::string> m_data[100]; //存放數據庫記錄,最大為100條int i = 0;while (m_row = mysql_fetch_row(m_res)){CString onerecord;onerecord.Format("%s - %s - %s - %s - %s - %s\n", m_row[0], m_row[1], m_row[2], m_row[3], m_row[4], m_row[5]);OutputDebugString(onerecord);}int a = 0;} }
經 測試成功!!!
由于系統是32位或者64位的不同,編譯時會引起如下錯誤:
無法解析的外部符號 _mysql_real_connect, 無法解析的外部符號 _mysql_query,無法解析的外部符號 _mysql_init;
解決辦法見:http://blog.csdn.net/u010439291/article/details/43898997
=======================================================================================
VS中建立MFC項目連接MySQL?的一般步驟見文章:《VS中MFC連接MySQL的方法》http://blog.csdn.net/u010439291/article/details/43889403
但是由于系統是32位或者64位的不同,編譯時會引起如下錯誤:
無法解析的外部符號 _mysql_real_connect, 無法解析的外部符號 _mysql_query,無法解析的外部符號 _mysql_init;
對于32位只要按照上述文章即可。
對于64位,有兩種方法解決上述錯誤:
方法一:由于VS建立的項目默認為WIN32 項目,需將平臺改為64。設置如下:
?????(1) 項目—》屬性—》配置屬性—》配置管理器—》活動解決方案平臺,下拉選新建,出現一個新的對號框,在鍵入選擇新平臺中選擇X64,如下圖所示:
????(2)不是將C:\ProgramFiles\MySQL\MySQL Server 5.7\lib(安裝MySql下的lib文件夾)中的libmysql.dll拷到項目下的Debug文件夾中,而是拷到項目下x64\Debug中(或者C:\Windows\System32中)。完畢。。
方法二:要包含32位的lib文件和dll文件。
32/64位MySql(lib、dll)資源:??http://download.csdn.net/detail/u010439291/8453041
(1)首先下載32位的lib文件和dll文件。
(2)需要將32位的lib文件拷到C:\Program Files\MySQL\MySQL Server 5.7\lib(安裝Mysql下的lib文件夾),拷貝之前需要將原來的libmysql.lib更名。也可以不改變原來的lib文件名稱,而將32位的libmysql.lib 改為libmysql32.lib 同時在:
項目—>屬性—>連接器—>輸入—>附加依賴項:添加libmysql32.lib(名稱和之前保持一致)。編譯通過之后,運行還要將32位的libmysql.dll放在工程目錄Debug文件夾中或者System32下。
===========================================================================================
關于項目配置請參考這篇文章?
http://blog.csdn.net/qq_18297675/article/details/52239881
關于亂碼問題請參考這篇文章?
http://blog.csdn.net/qq_18297675/article/details/52240029
需要注意的是,在MFC中有些函數的參數類型是LPCTSTR的,這樣就算數據庫返回的數據不亂碼,你把它強制轉換后還是會亂碼的。所以MFC中要把字符集改成多字節,這樣LPCTSTR就會自動轉換為LPCSTR,這是C語言的const char*類型,這樣就不會亂碼了。
程序效果如圖:?
程序源碼:鏈接:http://pan.baidu.com/s/1nvvraHz?密碼:le63
大概思路如下:?
1.把數據庫操作分為以下幾個部分
2.其它按鈕的功能就是調用上面那些函數
部分代碼如下:?
連接數據庫:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
查詢數據:
UpdateData(TRUE);ClearData();CString query;//條件全部為空則查詢所有書籍if (m_queryBook.IsEmpty() && m_queryAuthor.IsEmpty() && !m_priceMin && !m_priceMax)query.Format(TEXT("select * from book"));else if (!m_priceMin && !m_priceMax)//價格范圍為空{CString sBook,sAuthor;if (!m_queryBook.IsEmpty()){sBook.AppendChar('%');m_queryBook.AppendChar('%');sBook.Append(m_queryBook);}if (!m_queryAuthor.IsEmpty()){sAuthor.AppendChar('%');m_queryAuthor.AppendChar('%');sAuthor.Append(m_queryAuthor);}query.Format(TEXT("select * from book where 書名 like '%s' or 作者 like '%s';"), sBook, sAuthor);}else if (m_priceMin && !m_priceMax) query.Format(TEXT("select * from book where 售價 >= %f;"), m_priceMin);else if (!m_priceMin && m_priceMax)query.Format(TEXT("select * from book where 售價 <= %f;"), m_priceMax);else if (m_priceMin && m_priceMax)query.Format(TEXT("select * from book where 售價 >= %f and 售價 <=%f;"), m_priceMin,m_priceMax);//查詢數據if (mysql_query(&m_mysql, query))return FALSE;//獲取結果集m_res = mysql_store_result(&m_mysql);return TRUE;- 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
- 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
插入數據:
UpdateData(TRUE);if (m_addBook.IsEmpty()){AfxMessageBox(TEXT("書名不能為空!"));return FALSE;}CString query;query.Format(TEXT("insert into book values(NULL,'%s','%s','%s','%s',%.2f);"), m_addBook, m_addAuthor, m_addPublisher, m_addTime, m_addPrice);if (mysql_query(&m_mysql, query)){AfxMessageBox(TEXT("插入數據失敗!"));return FALSE;}return TRUE;- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
刪除數據:
UpdateData(TRUE);int iCount = m_list.GetItemCount();std::vector<std::string> row[100];int j = 0;//可以多選然后刪除for (int i = iCount; i >= 0; i--){if (m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED){CString bookName;bookName = m_list.GetItemText(i, 0);CString query;query.Format(TEXT("delete from book where 書名='%s';"), bookName);if (mysql_query(&m_mysql, query)){AfxMessageBox(TEXT("刪除數據失敗!"));return FALSE;}//要先刪除數據庫的記錄后才能刪除列表中的項,否則GetItemText會返回空m_list.DeleteItem(i);//刪除列表中的項}}return TRUE;- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
獲取數據:
//獲取記錄int i = 0;while (m_row = mysql_fetch_row(m_res)){m_data[i].push_back(m_row[0]);m_data[i].push_back(m_row[1]);m_data[i].push_back(m_row[2]);m_data[i].push_back(m_row[3]);m_data[i].push_back(m_row[4]);m_data[i++].push_back(m_row[5]);}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
顯示數據:
m_list.DeleteAllItems(); //先清空列表for (int i = 0;i<m_res->row_count;i++)//記錄條數{int iCount = m_list.GetItemCount();m_list.InsertItem(iCount, m_data[i][1].c_str());for (int j = 0;j < m_mysql.field_count - 2;j++)//字段數m_list.SetItemText(iCount, j + 1,m_data[i][j + 2].c_str());}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
需要注意的是,數據庫不要重復連接,所以一開始連接一次后下面就不用再調用那個函數了。結果集也不要釋放,等關閉程序后再釋放,數據庫關閉也是一樣的。
總結
以上是生活随笔為你收集整理的VS中MFC访问MySQL的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EasyHook远程代码注入
- 下一篇: mysql_ping与mysql长连接