13 MFC连接MySql数据库

  • 数据库相关感念
    数据库:是一个用来存储各种数据的容器。
    数据库管理系统:专门用于创建和管理数据库的统一软件,介于应用和操作系统之间,比如MySql Sql_Server Oracle等等;他们不仅有基础的数据管理能力,还能保证数据的完整性、安全性和可靠性。
    数据库应用程序:通过数据管理系统提供的接口,访问和管理数据的应用程序。
    SQL语言:它是一种数据库查询语言和程序设计语言,主要用来管理数据库中的数据,如存储数据、查询数据、更新数据和删除数据等。
    本篇使用的数据库为MySql,下载地址:
    https://downloads.mysql.com/archives/community/
  • 数据库的安装
    第一步:设置环境变量
    将你解压后放置的文件里边的bin目录加入到path中。例如:D:\mysql-8.0.12-winx64\bin
    第二步:配置初始化my.ini
    在D:\mysql-8.0.12-winx64\中创建添加my.ini,内容如下(根据自己实际情况更改):
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=D:\\mysql-8.0.12-winx64  # 切记此处一定要用双斜杠\\,单斜杠我这里会出错。
# 设置mysql数据库的数据的存放目录
datadir=D:\\mysql-8.0.12-winx64\\data   # 此处同上
# 允许最大连接数
max_connections=30
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8

第三步:初始化及安装
1.以管理员(必须)身份运行cmd命令,并将路径换到mysql的bin目录下
   2. 初始化数据库,运行命令:mysqld --initialize --console,这时会产生一个mysql的临时密码,我们要记下该密码,保存一下,登录和改密码要用:
A temporary password is generated for root@localhost: tnylBrV34VR
  3 安装服务,运行命令:mysqld --install [服务名] 其中服务名可以不写,默认是mysql ,至此mysql就安装完毕了
  4.接下来我们用刚才的临时密码将我们的root用户密码改成我们容易记且安全的!用命令: mysqladmin -uroot -ptn
ylBrV34VR password 123
安装过程中可能出现的问题,有可能以前安装过,或者初始化后我们换了目录,这是mysql服务会启动失败,我们只需要将windows注册表中的如下项的路径该成我们新路径就可以了:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL
在这里插入图片描述

  • 数据库的基本操作
    在操作之前,我们先来看看什么是数据库,什么是表,mysql实际是一个数据库管理工具,我们先来看一下我们安装的mysql下的data目录,如下图:
    在这里插入图片描述
    接下来开始操作数据库:
    登录数据库:输入命令mysql -uroot -p后回车输入密码即可登录数据库
    查看数据库:输入show databases; 后回车可以查看到有如下几个数据库
    在这里插入图片描述
    可以看到数据库对应的是data目录下的文件夹,接下来我们用use命令来选中mysql数据库use mysql;
    查询用户信息表:select * from user;可以看到一堆的用户信息,我们可以将表理解为文件夹下的文件,它存放了我们的对应信息;
    接下来我们使用 create database test;创建一个test数据库,再用show databases;查看数据库如下:
    在这里插入图片描述
    我们再进入data目录,可以看到在data目录下创建了一个空文件夹:
    在这里插入图片描述
    查看数据库信息: show create database test;
    在这里插入图片描述
    改变字节集:alter database test default character set gbk collate gbk_bin;
    可以将gbk换成utf8就能改回来默认utf8字符集;
    删除数据库:drop database test;
    记下来我们先创建数据库再创建一张userinfo 的表:
    create database test;
    use test;
    create table userinfo (id int, name varchar(80), age int);
    查看表:show tables;
    看到我们创建的表如下:
    在这里插入图片描述
    切换到我们的data目录下,打开我们的数据库文件夹test,看到里面有一个userinfo.ibd文件,我们可以用二进制查看软件打开,看一看里面放的些什么,可以看到除了一些字节填值以外,其他字节都是清零的。
    查看表信息:show create table userinfo;
    改表名: alter table userinfo rename user;
    查看表结构:desc user;
    修改字段:alter table user modify id int(6);
    修改字段名:alter table user change id userid int(3);
    添加字段:alter table user add new int(12);
    查看表数据:
    select * from 表名;
    为表中所有字段添加数据:
    insert into 表名(字段1,字段2,…) values(值1, 值2, …)
    更新字段:
    update 表名 set 字段=值 where 条件;
    删除数据:
    delete from 表名 where 条件表达式
    下面我们建立一个基于对话框的MFC工程连接并操作数据库,调试时我们可以用show processlist;命令查看连接状况;由于64位问题太多,这里我们将mysql的libmysql.lib和libmysql.dll换成32位的来用32位编译,并且设置静态库和头文件的路径。我们程序效果如下,
    当点击按钮能查出数据库结果并弹出对话框显示
    在这里插入图片描述
    我们在XXXXDlg.cpp文件中添加头文件及包含库如下代码,XXXX为新建的工程名,对应自己的文件;
#include "WinSock2.h"						//mysql用soket区连接数据库,所以包含此头文件
#include "mysql.h"							//包含mysql头文件

#pragma comment (lib, "libmysql.lib")

在testButton的点击事件处理函数如下:

void CConnectMySqlDlg::OnBnClickedButton1()
{
	//定义MYSQL结构体指针,这里我们可以F12跟进去看一下
	MYSQL *pMySql;
	MYSQL_RES *res;
	//初始化mysql,让其给我们分配结构体空间
	pMySql = mysql_init(NULL);
	if (pMySql == NULL){
		AfxMessageBox(_T("mysql_init failed!"));
		return;
	}
	//与mysql数据库进行连接
	if (!mysql_real_connect(pMySql, "127.0.0.1", "root", "123456", NULL, 3306, NULL, 0)){
		AfxMessageBox(_T("mysql_real_connect failed!"));
		return;
	}
	if (mysql_select_db(pMySql, "test") != 0){
		AfxMessageBox(_T("mysql_select_db failed!"));
		return;
	}
	if (mysql_query(pMySql, "select * from user;") != 0){
		AfxMessageBox(_T("mysql_query failed!"));
		return;
	}
	//存储结果
	res = mysql_store_result(pMySql);
	if (res == NULL){
		AfxMessageBox(_T("res failed!"));
		return;
	}
	MYSQL_FIELD *field;
	//查询字段
	for (int i = 0; field = mysql_fetch_field(res); i++){
		AfxMessageBox(CString(field->name));
	}
	MYSQL_ROW row;
	CString str;
	//查询内容
	mysql_set_character_set(pMySql, "utf16");
	while (row = mysql_fetch_row(res)){
		str.Format(_T("查询结果:字段1:%s, 字段2:%s,字段3:%s,字段4:%s"), CString(row[0]), CString(row[1]), CString(row[2]), CString(row[3]));
		AfxMessageBox(CString(str));
	}

	//资源清理
	mysql_close(pMySql);
	mysql_free_result(res);
}

猜你喜欢

转载自blog.csdn.net/lifeshave/article/details/85858852