C/C++连接数据库,包含完整代码。

C/C++连接数据库

本篇文章意在简洁明了的在linux环境下使用C/C++连接远程数据库,并对数据库进行增删查改等操作。我所使用的环境是centos7,不要环境除环境配置外,代码是大同小异的。完整代码在最底部!!!

1.前提准备

在讲解如何使用代码连接数据库前,我们先来了解一下相关环境的问题。有些同学在写完代码后,会发现编译报如下错误。
在这里插入图片描述
我相信大家已经能看出问题所在了,那就是相关的lib库和include头文件在编译的时候链接不到。所以大家一定先配置好该链接属性后在进行代码的编译运行!!!

可通过mysql_get_client_info()方法验证lib和include引入是否成功,如下代码所示。

#include <stdio.h>
#include <mysql.h>
int main()
{
	printf("mysql client Version: %s\n", mysql_get_client_info());
	return 0;
}

2.必须先对数据库初始化!

//创建数据句柄。
MYSQL *my = mysql_init(nullptr);

3.链接数据库

const std::string host="127.0.0.1";
const std::string user="sja";
const std::string password = "*****";
const std::string db = "books";
const unsigned int port = 8888;
mysql_real_connect(my,//上面创建的数据库句柄MYSQL指针
host.c_str(),//目标数据库主机
user.c_str(),//目标数据库用户名
password.c_str(),//目标数据库用户密码
db.c_str(),//指定连接哪一个库
port, //目标数据库的端口号
//下面两个参数默认如下即可!
nullptr, 
0);

4.设置编码格式

连接的数据库默认是阿拉伯语,会有编码混乱问题,为了统一字符的编码我们要自行设置数据库的编码格式。

 mysql_set_character_set(my, "utf8");

5.访问数据库

5.1 对数据库增删改的访问

这一部分对数据库的访问相比查询来说不涉及数据的返回问题,所以这部分的操作也是最为简单容易的。话不多说直接上代码。

//这个三个是最简单的,只要sql执行完毕,就完了!
    std::string sql1 = "insert into test values (4, \'黎明\')";
    std::string sql2 = "delete from test where id=3";
    std::string sql3 = "update test set name=\'彬彬\' where id=2";
    int code =0;
    mysql_query(my, sql1.c_str());
    mysql_query(my, sql2.c_str());
    mysql_query(my, sql3.c_str());
    //对于返回值code,成功为0。

5.2 对数据库查找的访问

select 其实是最不好处理的!!select sql执行完,只是第一步,还需要对数据进一步解析!解析的过程是需要进行处理的,直接上代码。

//	1.解析数据 -- 获取行号和列号
    MYSQL_RES *result = mysql_store_result(my);
    int rows = mysql_num_rows(result);
    int cols = mysql_num_fields(result);
    std::cout << "行数: " << rows << ", 列数: " << cols << std::endl;

    //2.解析数据 -- 获取表中列名 -- 实际开发一般不用,仅仅是为了测试代码的完整性
    MYSQL_FIELD *fields = mysql_fetch_fields(result);
    for(int i = 0; i < cols; i++)
    {
        std::cout << fields[i].name << "\t";
    }
    std::cout << std::endl;

    //3. 解析数据 -- 获取表中的数据 -- 重要
    for(int i = 0; i < rows; i++)
    {
        MYSQL_ROW line = mysql_fetch_row(result); //获取完整的一行记录[可能包含了多列]
        for(int j = 0; j < cols; j++)
        {
            std::cout << line[j] << "\t"; //将记录内部的多列字符串依次打印!
        }
        std::cout << std::endl;
    }

6.关闭数据库

其中上面的mysql_store_result函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。 一定注意这里的内存泄露问题,在关闭数据库前释放result!!!

//	关闭数据库
    free(result);
    mysql_close(my);

7.完整代码

#include <iostream>
#include <string>
#include <cstdio>
#include <mysql/mysql.h>

const std::string host="127.0.0.1";
const std::string user="username";
const std::string password = "888888888";
const std::string db = "user_databases";
const unsigned int port = 8888;

int main()
{
    //0. 创建mysql句柄
    MYSQL *my = mysql_init(nullptr);

    //1. 链接数据库
    if(mysql_real_connect(my,host.c_str(),user.c_str(), password.c_str(),db.c_str(),port, nullptr, 0) == nullptr)
    {
        std::cout << "connect failed" << std::endl;
        return 1;
    }
    //1.1: 需要设置链接的编码格式
    mysql_set_character_set(my, "utf8");
    std::cout << "connect success" << std::endl;
    //2. 访问 数据库.test id, name
    //这个三个是最简单的,只要sql执行完毕,就完了!
    // std::string sql = "insert into test values (4, \'黎明\')";
    // std::string sql = "delete from test where id=3";
    // std::string sql = "update test set name=\'彬彬\' where id=2";

    //2.1 select 其实是最不好处理的!!select sql执行完,只是第一步,还需要对数据进一步解析!
    std::string sql = "select name from test where id = 4";
    int code = mysql_query(my, sql.c_str());
    if(code != 0)
    {
        std::cout << "execute: " << sql << " failed" << std::endl;
        return 2;
    }
    std::cout << "execute: " << sql << " success" << std::endl;
    //2.2 解析数据 -- 获取行号和列号
    MYSQL_RES *result = mysql_store_result(my);
    int rows = mysql_num_rows(result);
    int cols = mysql_num_fields(result);
    std::cout << "行数: " << rows << ", 列数: " << cols << std::endl;

    //2.3 解析数据 -- 获取表中列名 -- 一般不用,仅仅是为了测试代码的完整性
    MYSQL_FIELD *fields = mysql_fetch_fields(result);
    for(int i = 0; i < cols; i++)
    {
        std::cout << fields[i].name << "\t";
    }
    std::cout << std::endl;

    //2.4 解析数据 -- 获取表中的数据 -- 重要
    for(int i = 0; i < rows; i++)
    {
        MYSQL_ROW line = mysql_fetch_row(result); //获取完整的一行记录[可能包含了多列]
        for(int j = 0; j < cols; j++)
        {
            std::cout << line[j] << "\t"; //将记录内部的多列字符串依次打印!
        }
        std::cout << std::endl;
    }

    //3. 关闭数据库
    free(result);
    mysql_close(my);
    return 0;
}
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jiawen_captial

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值