数据库与vs的连接

新建一个MFC基于对话框的项目后,更改属性,  其中需要将include(里面都是MySQL的头文件)lib是库文件,将.dll放入与.exe同级目录下,或放入系统里(c:windowssystem32)

数据库与vs的连接

封装一个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是关闭窗口函数;

 数据库与vs的连接

更新按钮的实现

void MyDlg::OnBnClickedButton1()
{
    UpdateData();
    // TODO: 在此添加控件通知处理程序代码
    if(theApp.m_mysql.UpdateMySql(m_editstr.GetBuffer()))
    {
        MessageBox("登陆成功");    
    }
}

其中需要注意的:CString 转成 char*类型的函数GetBuffer()

String 的内部是用char* 来封装的,装成char*的函数是c_str()