使用C++实现MySQL数据库编程

1.使用C++访问MySQL数据库

使用到的软件:

编译器:Visual Studio 2019

数据库软件:MySQL 8.0

第一步:打开MySQL的安装目录,默认的安装路径为:C:\Program Files\MySQL\MySQL Server 8.0,查看其中是否有lib和include目录,如果没有可能是安装不完全,建议重新安装MySQL。

 第二步:使用VS2019创建一个新的工程,右击工程名,点击属性,

点击C/C++目录下的常规,将include目录复制粘贴至附加包含目录下。(VS2015之后可能会出现刚创建的项目中没有C/C++选项,这时只要写一些代码编译一下就会出现)

点击链接器下的常规,将lib目录粘贴至附加库目录下。

点击链接器下的输入,在附加依赖项添加libmysql.lib。

点击配置下的高级,将bin文件夹目录复制到环境下(注意在前面加上PATH=,以及最后的分号是英文符号)。最后点击应用。 

 然后将lib目录下的libmysql.ddl文件复制到与项目工程源文件相同的目录下

最后将项目的运行平台修改为×64。

至此在VS2019中使用C++访问MySQL数据库的环境配置结束。

2.对数据库的增删改查操作

1.对数据库的查询操作

1.1查询全部数据并输出

mysql_store_result()函数可以将查询到的全部结果读取到客户端,然后可以调用mysql_fetch_row()来获取结果集中的行,需要注意的是,一旦完成了对结果集的操作,就必须调用mysql_free_result()来释放结果集。

#include <mysql.h> // mysql文件
#include <iostream>
#include <cstring>
#include <stdio.h>

using namespace std;

MYSQL mysql;    //数据库句柄
MYSQL_RES* res; //查询结果集
MYSQL_ROW row;  //记录结构体

//查询全部数据并输出
void display()
{
	//查询数据
	int ret = mysql_query(&mysql, "select * from student;");

	//获取结果集
	res = mysql_store_result(&mysql);

	cout << "ID " << "name " << "age " << "score" << endl;
    //给ROW赋值,判断ROW是否为空,不为空就打印数据。
	while (row = mysql_fetch_row(res))
	{
		cout << row[0] << "  ";//打印ID
		cout << row[1] << "  ";//打印name
		cout << row[2] << "  ";//打印age
		cout << row[3] << endl;//打印score
	}
	//释放结果集
	mysql_free_result(res);

	//关闭数据库
	mysql_close(&mysql);
}

int main()
{

	//初始化数据库
	mysql_init(&mysql);

	//设置字符编码
	mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");

	//连接数据库
	if (mysql_real_connect(&mysql, "localhost", "root", "root", "student", 3306, NULL, 0) == NULL) 
    //localhost为服务器,root为用户名和密码,school为数据库名,3306为端口
    {
		printf("错误原因: %s\n", mysql_error(&mysql));
		printf("连接失败!\n");
		exit(-1);
	}

    display();

    //关闭数据库
	mysql_close(&mysql);
	return 0;
}

 1.2查询指定数据并将mysql_fetch_row返回的字段中int或float的字段赋值给int或float类型的变量

由于mysql_row指针返回的是字符串数组,所有类型的数据都是作为字符串返回给客户端的,所有我们可以利用atoi()stof()函数来实现将mysql_row中的字符串转化为对应的整型和浮点型的值。

//查询特定数据
void select(int& ID, char str[], int& age, float& score)
{
	char str1[64] = "SELECT * FROM student WHERE NAME='";
	char str2[2] = "'";
	char buffer[1024];//缓冲区数组

	sprintf_s(buffer, "%s%s%s", str1, str, str2);
	mysql_query(&mysql, buffer);
	res = mysql_store_result(&mysql);
	//给ROW赋值,判断ROW是否为空,不为空就打印数据。
	while (row = mysql_fetch_row(res))
	{
		ID = atoi(row[0]);
		age = atoi(row[2]);
		score = atof(row[3]);
		cout <<"ID=" << ID << " name=" << row[1] <<  " age=" << age << " score=" << score << endl;
	}
	//释放结果集
	mysql_free_result(res);
}

2.对数据库的插入数据操作

sprintf()与printf()类似,只不过printf()是将内容打印至控制台,而sprintf()是将字符串打印至缓冲区。sprintf()主要功能是把格式化的数据写入某个字符串中,可以实现将字符串与数值拼接,并保存为一个字符串的功能,从而可以通过多个字符串与数值变量拼接,来实现可变的查询、插入、删除等sql语句。其中sprintf_s()是sprintf()的安全版本,它通过指定缓冲区长度来避免sprintf()存在的溢出风险,在使用上二者并无太大差别,但是在VS2018之后的版本如果使用sprintf()编译器会发出报错,提示你将其修改为sprintf_s()。

void insert(MYSQL* conn, int ID, char name[20], int age, float score)
//插入数据
{
	char str[64] = "INSERT INTO student VALUES( ";
	char buffer[128] = { 0 };
	char str2[4] = ",'";
	char str3[4] = "',";
	char str4[2] = ",";
	char str5[2] = ")";
	int len = sprintf_s(buffer, "%s%d%s%s%s%d%s%f%s", str, ID, str2, name, str3, age, str4, score, str5);
	mysql_query(&mysql, buffer);
	if (len < 0)
		cout << "存档失败!" << endl;
	if (len > 0)
		cout << "存档成功!" << endl;
}

3.对数据库的更新数据操作

void update(MYSQL* conn, int ID, char name[20], int age, float score)
//更新数据
{
	char str[64] = "UPDATE student SET ID=";
	char buffer[128] = { 0 };
	char str2[16] = ",age=";
	char str3[16] = ",score=";
	char str4[32] = " WHERE name='";
	char str5[10] = "'";
	int len = sprintf_s(buffer, "%s%d%s%d%s%f%s%s%s", str, ID, str2, age, str3, score, str4, name, str5);
	mysql_query(&mysql, buffer);
	if (len < 0)
		cout << "修改失败!" << endl;
	if (len > 0)
		cout << "修改成功!" << endl;
}

4.对数据库的删除数据操作

void delete(char str2[])
//删除数据
{
	char str1[64] = "DELETE FROM student WHERE name='";
	char str3[10] = "'";
	char buffer[1024];
	int len = sprintf_s(buffer, "%s%s%s", str1, str2, str3);
	mysql_query(&mysql, buffer);
	if (len < 0)
		cout << "删除失败!" << endl;
	else
		cout << "删除成功!" << endl;
}

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值