數據庫與vs的連接


新建一個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()

 


免責聲明!

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



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