新建一個MFC基於對話框的項目后,更改屬性, 其中需要將include(里面都是MySQL的頭文件)lib是庫文件,將.dll放入與.exe同級目錄下,或放入系統里(c:\windows\system32)
封裝一個MySQL類
CMysql.h
#pragma once #include <mysql.h> //#include <WinSock2.h> #pragma comment(lib,"libmysql.lib") // #include <list> using namespace std; class CMySql { public: CMySql(void); ~CMySql(void); public: bool ConnectMySql(char *host,char *user,char *pass,char *db); void DisConnect(); bool SelectMySql(char* szSql,int nColumn,list<string>& lstStr); //更新:刪除、插入、修改 bool UpdateMySql(char* szSql); private: MYSQL *sock; MYSQL_RES *results; MYSQL_ROW record; };
CMysql.cpp
#include "stdafx.h" #include "CMySql.h" CMySql::CMySql(void) { /*這個函數用來分配或者初始化一個MYSQL對象,用於連接mysql服務端。 如果你傳入的參數是NULL指針,它將自動為你分配一個MYSQL對象, 如果這個MYSQL對象是它自動分配的,那么在調用mysql_close的時候,會釋放這個對象*/ sock = new MYSQL; mysql_init(sock ); mysql_set_character_set(sock,"gb2312"); //gb2312 中華人民共和國簡體字標准 } CMySql::~CMySql(void) { if(sock) { delete sock; sock = NULL; } } void CMySql::DisConnect() { mysql_close(sock); } bool CMySql::ConnectMySql(char *host,char *user,char *pass,char *db) { if (!mysql_real_connect(sock, host, user, pass, db, 0, NULL, CLIENT_MULTI_STATEMENTS)) { //連接錯誤 return false; } return true; } bool CMySql::SelectMySql(char* szSql,int nColumn,list<string>& lstStr) { //mysql_query() 函數用於向 MySQL 發送並執行 SQL 語句 if(mysql_query(sock,szSql))return false; /*·mysql_store_result 對於成功檢索了數據的每個查詢(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等) 返回值: . CR_COMMANDS_OUT_OF_SYNC 以不恰當的順序執行了命令。 · CR_OUT_OF_MEMORY 內存溢出。 · CR_SERVER_GONE_ERROR MySQL服務器不可用。 · CR_SERVER_LOST 在查詢過程中,與服務器的連接丟失。 · CR_UNKNOWN_ERROR 出現未知錯誤。*/ results=mysql_store_result(sock); if(NULL == results)return false; while (record = mysql_fetch_row(results)) { for(int i = 0;i < nColumn;i++) { lstStr.push_back(record[i]); } } return true; } bool CMySql::UpdateMySql(char* szSql) { if(!szSql)return false; if(mysql_query(sock,szSql))return false; return true; }
注冊按鈕實現函數:
void CMysqlDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知處理程序代碼 UpdateData(); char sz[100] = {0}; sprintf_s(sz,"insert user values ('%s','%s')",m_edituser,m_editpsw); if(theApp.m_mysql.UpdateMySql(sz)) { MessageBox(_T("注冊成功")); } else MessageBox(_T("注冊失敗")); }
登陸按鈕實現函數:
void CMysqlDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知處理程序代碼 UpdateData(); char sz[100] = {0}; list<string> lststr; string password; sprintf_s(sz,"select password from user where username = '%s'",m_edituser); if(theApp.m_mysql.SelectMySql(sz,1,lststr)) { password = lststr.front(); lststr.pop_front(); if(strcmp(password.c_str(),m_editpsw) == 0) { MessageBox("登陸成功");
CMysqlDlg::OnOK();
MyDlg mydlg;
theApp.m_pMainWnd = &mydlg;
mydlg.DoModal();
} else { MessageBox("登陸失敗"); } } }
OnOK是關閉窗口函數;
更新按鈕的實現
void MyDlg::OnBnClickedButton1() { UpdateData(); // TODO: 在此添加控件通知處理程序代碼 if(theApp.m_mysql.UpdateMySql(m_editstr.GetBuffer())) { MessageBox("登陸成功"); } }
其中需要注意的:CString 轉成 char*類型的函數GetBuffer()
String 的內部是用char* 來封裝的,裝成char*的函數是c_str()