数据库与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()