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


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

    使用到的软件:

    编译器:Visual Studio 2019

    数据库软件:MySQL 8.0

    第一步:打开MySQL的安装目录,默认的安装路径为:C:Program FilesMySQLMySQL 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
    ", mysql_error(&mysql));
    		printf("连接失败!
    ");
    		exit(-1);
    	}
    
        display();
    
        //关闭数据库
    	mysql_close(&mysql);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    ⑩② 【MySQL索引】详解MySQL`索引`:结构、分类、性能分析、设计及使用规则。
    基于微信小程序的房屋租赁系统设计与实现(源码+lw+部署文档+讲解等)
    DBCO-PEG3-Maleimide,Mal-PEG3-DBCO,二苯并环辛炔-三聚乙二醇-马来酰亚胺
    职场「OKR」,魔幻又内卷
    built with gcc 12.1.0 (Rev2, Built by MSYS2 project)
    【运维】一些团队开发相关的软件安装。
    光标签使能的车路协同现状与展望
    [补题记录]LeetCode 151.反转字符串中的单词
    【go】linux服务器 go从1.18.x版本升级1.19.x
    Transformer模型 | 用于目标检测的视觉Transformers训练策略
  • 原文地址:https://blog.csdn.net/m0_67393828/article/details/125383638