• c++ 连接mysql数据库


            使用vs2019对window11中的数据库进行连接

    1. 配置连接环境

            首先需要把mysql中的头文件和库文件放入到c++项目工程中

    1.打开安装MySQL的目录,在windows系统中如果是默认路径,应该和我的是一样的:C:\Program Files\MySQL\MySQL Server 8.0

    2.找到include,和lib文件,include文件是包含的头文件,lib文件是包含的库文件

     3.在创建的c++工程中加入include,lib文件路径,按一下步骤

            1.工程中的项目找到属性

            2.到 VC++ 目录 中的包含目录和库目录分别加入include文件和lib文件的路径,

                    这是我的路径:include文件路径:C:\Program Files\MySQL\MySQL Server 8.0\include

                                             lib文件路径:C:\Program Files\MySQL\MySQL Server 8.0\lib

             3. 到 链接器 中的 输入 中的 附加依赖项中 加入 libmysql.lib 的依赖:

             4.还需要把下图中的 libmysql.dll 的文件复制到 C:\Windows\System32 目录中

     

    连接mysql可以参考 mysql参考手册 进行查看

    2.代码实现连接

            1. mysql_read_connect函数,连接成功会返回MYSQL*连接句柄,返回得值与第一个参数得值相同,连接失败返回一个null:

    1. mysql_real_connect(
    2. MYSQL *mysql, ///< 数据库句柄
    3. const char *host, ///< 主机名
    4. const char *user, ///< 用户名
    5. const char *passwd,///< 密码
    6. const char *db, ///< 数据库名
    7. unsigned int port, ///< 端口号(MySQL为3306)
    8. const char *unix_socket,///< unix_socket–unix连接方式,为NULL时表示不使用socket或管道机制
    9. unsigned long clientflag ///< clientflag–Mysql运行为ODBC数据库的标记,一般取0
    10. );

            例子:

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main()
    7. {
    8. int sr;
    9. srand((unsigned)time(NULL));
    10. sr = rand() % 50 + 1;
    11. //固定不变的
    12. MYSQL mysql; //一个数据库结构体
    13. MYSQL_RES* res; //一个结果集结构体
    14. MYSQL_ROW row; //char** 二维数据,存放一条条记录
    15. //初始化数据库
    16. mysql_init(&mysql);
    17. //设置编码方式
    18. mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
    19. //连接数据库 //ip地址 //用户名 //密码 //数据库名
    20. if (mysql_real_connect(&mysql, "localhost", "root", "Z20020803", "box_man", 3306, NULL, 0) == NULL)
    21. {
    22. printf("错误原因:%s\n", mysql_error(&mysql));
    23. printf("连接失败\n");
    24. exit(-1);
    25. }
    26. //往数据库中插入一个随机数
    27. char* str1 = "insert into rand values(";
    28. char sql_insert[200];
    29. sprintf(sql_insert, "%s%d%s", str1, sr, ")");
    30. mysql_query(&mysql, sql_insert); //sql语句提交
    31. //查询数据
    32. mysql_query(&mysql, "select * from rand");
    33. //获取结果集
    34. res = mysql_store_result(&mysql);
    35. //给ROW赋值,判断ROW是否为空,不为空就打印数据
    36. while (row = mysql_fetch_row(res))
    37. {
    38. printf("%s\n", row[0]);
    39. }
    40. //释放结果集
    41. mysql_free_result(res);
    42. //关闭数据库
    43. mysql_close(&mysql);
    44. //停留等待
    45. system("pause");
    46. return 0;
    47. }

            使用c++语句对数据库进行增删改查,在使用c++中string类型时,需要把string类型转换为c中的类型,使用mysql_query函数把sql语句提交,查询成功返回0,结果会被保存到mysql对象中,查询失败会返回非0值:

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. int main()
    7. {
    8. MYSQL mysql;
    9. MYSQL_RES* res;
    10. MYSQL_ROW row;
    11. mysql_init(&mysql);
    12. if (mysql_real_connect(&mysql, "localhost", "root", "Z20020803", "box_man", 3306, NULL, 0) == NULL)
    13. {
    14. printf("错误提示:%s\n", mysql_error(&mysql));
    15. printf("连接失败\n");
    16. }
    17. //设置字符集
    18. mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
    19. string str1 = "alter table tb_77 modify sex varchar(20);";//修改表类型失败
    20. mysql_query(&mysql, str1.c_str());
    21. string str = "insert into tb_77 values(5,'sdmqy','h');";//增加数据成功,不可以增加汉字
    22. mysql_query(&mysql, str.c_str());
    23. printf("%s", str.c_str());
    24. string str2 = "delete from tb_77 where sex = '女';";//删除数据成功
    25. mysql_query(&mysql, str2.c_str());
    26. string str3 = "update tb_77 set name = 'ttb' where id = 2;";//更改也行
    27. mysql_query(&mysql, str3.c_str());
    28. mysql_close(&mysql);
    29. return 0;
    30. }

            各个类说明:

    1.  mysql句柄类

    1MYSQL mysql;

            该类在c++中操作数据库都要使用到

    2.MYSQL_RES查询结果集

    2MYSQL_RES * res=nullptr;

            用来保存查询到的所有结果

    3.MYSQL_ROW获取结果集中的内容

    3.MYSQL_ROW row

            该变量可以获取到结果集中的数据,并且输出

    4.获取查询结果集

    1mysql_store_result(查询结果集变量)
    2mysql_use_result(查询结果集变量)

            第一种调用mysql_store_result(查询结果集变量),把mysql数据库中指定的表的数据全部进行保存,把服务端得数据保存到客户端

            第二种调用mysql_use_result(查询结果集变量),初始化检索,方便后面一行一行读取结果集,速度快,占用内存少,但是会阻止其它线程使用,

    5.读取结果集

    1mysql_fetch_row(查询结果集)

            从结果集中获取到一行数据,有数据保存改行的每个字段值,没有返回一个null

    3.一些函数说明

            1.mysql_num_fields(MYSQL_RES*)

                    该函数可以拿表中的列数,返回值是一个unsigned类型

            2.mysql_fetch_fields(MYSQL_RES*)

                    该函数可以拿到表中每一列的字段名,返回的是一个结构体数组

            3.mysql_fetch_lengths(MYSQL_RES*)

                    该函数拿到行中每一列的字段长度,返回结果是一个unsigned类型

            4.mysql_free_result(MYSQL_RES*)

                    该函数释放结果集

            5.事务设置:
            在mysql中事务是默认自动提交的,如果需要提交的事务多,对我们的操作会有影响,所以需要设置事务为手动提交

    • mysql_autocommit(MYSQL* , mode)  设置事务是否自动提交函数

            参数:mode如果为“1”,自动提交,为“0”为手动提交   返回值:提交成功返回0,否则返回非0

    • mysql_commit(MYSQL* mysql)  事务提交函数

            返回值:成功返回0,否则返回非0

    • mysql_rollback(MYSQL* mysql)  事务回滚函数

            返回值:成功返回0,否则返回非0

            6.打印错误信息:

    • const char* mysql_error(MYSQL* mysql):返回错误信息的描述
    • const char* mysql_errno(MYSQL* mysql):返回错误的编号

    代码使用的例子

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. #include
    4. using namespace std;
    5. int main()
    6. {
    7. //创建句柄
    8. MYSQL mysql;
    9. //创建数据集变量
    10. MYSQL_RES* res = nullptr;
    11. //创建结果集变量
    12. MYSQL_ROW row;
    13. //创建一个结构体
    14. MYSQL_FIELD* field;
    15. //初始化数据库句柄
    16. mysql_init(&mysql);
    17. //设置字符集
    18. //mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
    19. mysql_set_character_set(&mysql, "gbk");
    20. //开始连接数据库
    21. if (mysql_real_connect(&mysql, "localhost", "root", "Z20020803", "box_man", 3306, NULL, 0))
    22. {
    23. cout << "连接成功" << endl;
    24. }
    25. else
    26. {
    27. cout << "连接失败" << endl;
    28. return 0;
    29. }
    30. //设置事务
    31. mysql_autocommit(&mysql, "1");
    32. //增加数据
    33. string str1 = "insert into tb_912 values(2, 'xiaoming', '李四');";
    34. char ssql[1024];
    35. //使用sprintf拼出来的语句是一个标准的c语言字符串,可以使用该函数插入变量值
    36. sprintf(ssql, "insert into tb_912 values(%d, '%s', '%s');", 3, "daming", "17777777772");
    37. if (mysql_query(&mysql, ssql))//该语句提交成功返回0,失败放回1
    38. {
    39. cout << "提交失败" << endl;
    40. }
    41. else
    42. {
    43. cout << "提交成功" << endl;
    44. }
    45. //提交语句
    46. mysql_query(&mysql, str1.c_str());
    47. //删除数据
    48. string str3 = "delete from tb_912 where id = 2;";
    49. mysql_query(&mysql, str3.c_str());
    50. //修改数据
    51. string str4 = "update tb_912 set name = '张三' where id = 1;";
    52. mysql_query(&mysql, str4.c_str());
    53. //查询数据
    54. string str2 = "select * from tb_912;";
    55. mysql_query(&mysql, str2.c_str());
    56. //事务提交
    57. mysql_commit(&mysql);
    58. //获取里面的结果集
    59. res = mysql_store_result(&mysql);
    60. //拿到结果集得列数,调用的是 mysql_store_result() 的返回值,
    61. unsigned int a = mysql_num_fields(res);
    62. cout <<"表得列数:"<< a << endl;
    63. //使用 mysql_fetch_fields() 函数获取列的名字,返回的是一个结构体数组
    64. field = mysql_fetch_fields(res);
    65. for (unsigned i = 0; i < a; i++)
    66. {
    67. cout << "当前列的名字:" << field[i].name << endl;//取出名字
    68. }
    69. unsigned long* lengths;
    70. //从结果集中获取到数据 mysql_fetch_row() 获取结果集中的一行数据,
    71. //成功:返回记录当前行中每个字段的值,失败:返回一个null
    72. while (row = mysql_fetch_row(res))
    73. {
    74. printf("%s %s %s \n", row[0], row[1], row[2]);
    75. //获取列中字段的长度
    76. lengths = mysql_fetch_lengths(res);//返回的是一个数组地址
    77. for (unsigned int i = 0; i < a; i++)
    78. {
    79. cout << "当前列的长度:" << lengths[i] << endl;//列数会构成一个数组
    80. }
    81. }
    82. //释放结果集
    83. mysql_free_result(res);
    84. //关闭mysql实例
    85. mysql_close(&mysql);
    86. return 0;
    87. }
  • 相关阅读:
    初识操作系统
    Redis中的Lua脚本(六)
    云原生:Docker 实践经验(六)-镜像的使用及分层讲解
    JDBC介绍
    hive01--hive的安装及配置
    高科技电子行业采购供应链管理
    Flutter-使用MethodChannel 实现与iOS交互
    Jmeter是什么
    分享一个自用的Win11护眼主题(无需下载)
    R语言绘制时间序列的偏自相关函数图:使用pacf函数可视化时间序列数据的偏自相关系数图、分析是否存在自相关性以及显著相关的个数
  • 原文地址:https://blog.csdn.net/weixin_62859191/article/details/126819020