0


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 的依赖:![](https://img-blog.csdnimg.cn/70e4227528e34e4fa4126a6735020594.png)

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

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

2.代码实现连接

    1. mysql_read_connect函数,连接成功会返回MYSQL*连接句柄,返回得值与第一个参数得值相同,连接失败返回一个null:
mysql_real_connect(
    MYSQL *mysql,   ///< 数据库句柄
    const char *host, ///< 主机名
    const char *user, ///< 用户名
    const char *passwd,///< 密码
    const char *db, ///< 数据库名
    unsigned int port, ///< 端口号(MySQL为3306)
    const char *unix_socket,///< unix_socket–unix连接方式,为NULL时表示不使用socket或管道机制
    unsigned long clientflag ///< clientflag–Mysql运行为ODBC数据库的标记,一般取0
    );
    例子:
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<mysql.h>
#include<time.h>
#include<stdlib.h>

int main()
{
    int sr;
    srand((unsigned)time(NULL));
    sr = rand() % 50 + 1;
    //固定不变的
    MYSQL mysql;    //一个数据库结构体  
    MYSQL_RES* res; //一个结果集结构体
    MYSQL_ROW row; //char** 二维数据,存放一条条记录
    //初始化数据库
    mysql_init(&mysql);
    //设置编码方式
    mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");

    //连接数据库                    //ip地址       //用户名 //密码       //数据库名
    if (mysql_real_connect(&mysql, "localhost", "root", "Z20020803", "box_man", 3306, NULL, 0) == NULL)
    {
        printf("错误原因:%s\n", mysql_error(&mysql));
        printf("连接失败\n");
        exit(-1);
    }
    //往数据库中插入一个随机数
    char* str1 = "insert into rand values(";
    char sql_insert[200];
    sprintf(sql_insert, "%s%d%s", str1, sr, ")");
    mysql_query(&mysql, sql_insert); //sql语句提交
    //查询数据
    mysql_query(&mysql, "select * from rand");
    //获取结果集
    res = mysql_store_result(&mysql);
    //给ROW赋值,判断ROW是否为空,不为空就打印数据
    while (row = mysql_fetch_row(res))
    {
        printf("%s\n", row[0]);
    }
    //释放结果集
    mysql_free_result(res);
    //关闭数据库
    mysql_close(&mysql);
    //停留等待
    system("pause");
    return 0;

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

#include<iostream>
#include<mysql.h>
#include<string>
using namespace std;

int main()
{
    MYSQL mysql;
    MYSQL_RES* res;
    MYSQL_ROW row;

    mysql_init(&mysql);

    if (mysql_real_connect(&mysql, "localhost", "root", "Z20020803", "box_man", 3306, NULL, 0) == NULL)
    {
        printf("错误提示:%s\n", mysql_error(&mysql));
        printf("连接失败\n");
    }
    //设置字符集
    mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");

    string str1 = "alter table tb_77 modify sex varchar(20);";//修改表类型失败
    mysql_query(&mysql, str1.c_str());
    string str = "insert into tb_77 values(5,'sdmqy','h');";//增加数据成功,不可以增加汉字
    mysql_query(&mysql, str.c_str());
    printf("%s", str.c_str());
    string str2 = "delete from tb_77 where sex = '女';";//删除数据成功
    mysql_query(&mysql, str2.c_str());
    string str3 = "update tb_77 set name = 'ttb' where id = 2;";//更改也行
    mysql_query(&mysql, str3.c_str());

    mysql_close(&mysql);

    return 0;
}
    **各个类说明:**

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):返回错误的编号

代码使用的例子

#define _CRT_SECURE_NO_WARNINGS

#include<iostream>
#include<mysql.h>
using namespace std;

int main()
{
    //创建句柄
    MYSQL mysql;
    //创建数据集变量
    MYSQL_RES* res = nullptr;
    //创建结果集变量
    MYSQL_ROW row;
    //创建一个结构体
    MYSQL_FIELD* field;

    //初始化数据库句柄
    mysql_init(&mysql);
    //设置字符集
    //mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
    mysql_set_character_set(&mysql, "gbk");
    //开始连接数据库
    if (mysql_real_connect(&mysql, "localhost", "root", "Z20020803", "box_man", 3306, NULL, 0))
    {
        cout << "连接成功" << endl;
    }
    else
    {
        cout << "连接失败" << endl;
        return 0;
    }
    //设置事务
    mysql_autocommit(&mysql, "1");
    //增加数据
    string str1 = "insert into tb_912 values(2, 'xiaoming', '李四');";
    char ssql[1024];
    //使用sprintf拼出来的语句是一个标准的c语言字符串,可以使用该函数插入变量值
    sprintf(ssql, "insert into tb_912 values(%d, '%s', '%s');", 3, "daming", "17777777772");
    if (mysql_query(&mysql, ssql))//该语句提交成功返回0,失败放回1
    {
        cout << "提交失败" << endl;
    }
    else
    {
        cout << "提交成功" << endl;
    }
    //提交语句
    mysql_query(&mysql, str1.c_str());
    //删除数据
    string str3 = "delete from tb_912 where id = 2;";
    mysql_query(&mysql, str3.c_str());
    //修改数据
    string str4 = "update tb_912 set name = '张三' where id = 1;";
    mysql_query(&mysql, str4.c_str());
    //查询数据
    string str2 = "select * from tb_912;";
    mysql_query(&mysql, str2.c_str());
    //事务提交
    mysql_commit(&mysql);
    //获取里面的结果集
    res = mysql_store_result(&mysql);
    //拿到结果集得列数,调用的是 mysql_store_result() 的返回值,
    unsigned int a = mysql_num_fields(res);
    cout <<"表得列数:"<< a << endl;
    //使用 mysql_fetch_fields() 函数获取列的名字,返回的是一个结构体数组
    field = mysql_fetch_fields(res);
    for (unsigned i = 0; i < a; i++)
    {
        cout << "当前列的名字:" << field[i].name << endl;//取出名字
    }
    unsigned long* lengths;

    //从结果集中获取到数据 mysql_fetch_row() 获取结果集中的一行数据,
    //成功:返回记录当前行中每个字段的值,失败:返回一个null
    while (row = mysql_fetch_row(res))
    {
        printf("%s %s %s \n", row[0], row[1], row[2]);
        //获取列中字段的长度
        lengths = mysql_fetch_lengths(res);//返回的是一个数组地址
        
        for (unsigned int i = 0; i < a; i++)
        {
            cout << "当前列的长度:" << lengths[i] << endl;//列数会构成一个数组
        }
    }
    //释放结果集
    mysql_free_result(res);
    //关闭mysql实例
    mysql_close(&mysql);
    return 0;
}
标签: 数据库

本文转载自: https://blog.csdn.net/weixin_62859191/article/details/126819020
版权归原作者 爱笑的蛐蛐 所有, 如有侵权,请联系我们删除。

“c++ 连接mysql数据库”的评论:

还没有评论