【MySQL】使用C++连接数据库

前置工作

  1. 创建数据库并选中
mysql> create database conn;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| conn               |
+--------------------+
2 rows in set (0.00 sec)

mysql> use conn
Database changed
  1. 创建表并描述表结构
mysql> create table user( id int primary key auto_increment, name varchar(32) not null, age int not null, telphone varchar(32) unique);
Query OK, 0 rows affected (0.06 sec)

mysql> show tables;
+----------------+
| Tables_in_conn |
+----------------+
| user           |
+----------------+
1 row in set (0.00 sec)

mysql> desc user;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| name     | varchar(32) | NO   |     | NULL    |                |
| age      | int(11)     | NO   |     | NULL    |                |
| telphone | varchar(32) | YES  | UNI | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

代码

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

const std::string host = "127.0.0.1";
const std::string user = "connector";
const std::string password = "123456";
const std::string db = "conn";
const unsigned int port = 3306;

int main()
{
    // std::cout<<"mysql client version: "<<mysql_get_client_info()<<std::endl;
    MYSQL *my = mysql_init(nullptr);
    if (nullptr == my)
    {
        std::cerr << " init MYSQL error" << std::endl;
        return 1;
    }
    if (mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        std::cerr << " connect MYSQL error" << std::endl;
        return 2;
    }
    mysql_set_character_set(my, "utf8");
    // std::cout<<"connect success "<<std::endl;
    // std::string sql="insert into user(name,age,telphone) values('jim',18,'123488899');";
     std::string sql="update user set name='李四' where id =2;";
    // std::string sql = "delete from user where id =3; ";
    //std::string sql = "select * from user";
    int n = mysql_query(my, sql.c_str());
    if (n == 0)
        std::cout << sql << " success " << std::endl;
    else
    {
        std::cerr << "filed :" << sql << std::endl;
        return 3;
    }
    mysql_close(my);
    return 0;
}
  1. 增加删除修改均可正常执行,查询较为复杂,整体代码中有案例
  2. 如果查询则需要把查询数据保存到结果集,通过mysql所提供的函数 得到行和列,遍历得到结果。

常用函数接口

  1. 初始化mysql并返回句柄(默认传入nullptr即可)
MYSQL *mysql_init(MYSQL *mysql);

如: MYSQL *mfp = mysql_init(nullptr)

  1. 链接数据库
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned long clientflag);

所需参数分别是 mysql句柄 ,主机ip,sql用户名,sql密码,数据库,端口号,剩余两个填nullptr和0即可
如:

if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
{
   std::cerr << " connect MYSQL error" << std::endl;
   return 2;
}
  1. 设置字符集编码
mysql_set_character_set(myfd, "utf8");
  1. 执行sql语句
int mysql_query(MYSQL *mysql, const char *q);
  1. 获取查询结果并保存到结果集
MYSQL_RES *mysql_store_result(MYSQL *mysql);

如:

    //把结果存到结果集中
    MYSQL_RES *res = mysql_store_result(my);
    if (nullptr == res)
    {
        std::cerr << " mysql_store_result error" << std::endl;
        return 4;
    }
  • 获取结果行数mysql_num_rows
my_ulonglong mysql_num_rows(MYSQL_RES *res);
  • 获取结果列数mysql_num_fields
unsigned int mysql_num_fields(MYSQL_RES *res);
  • 获取列名mysql_fetch_fields
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

如:

  my_ulonglong row = mysql_num_rows(res);
    my_ulonglong col = mysql_num_fields(res);
    std::cout << "行: " << row << std::endl;
    std::cout << "列: " << col << std::endl;
    std::cout<<std::endl;

    //属性
    MYSQL_FIELD* fields=mysql_fetch_fields(res);
    for(int i=0;i<col;++i)
    {
        std::cout<< fields[i].name<<"\t";
    }
    std::cout<<std::endl;
  • 获取结果内容mysql_fetch_row
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

如:

  //内容
    for (int i = 0; i < row; ++i)
    {
        MYSQL_ROW row = mysql_fetch_row(res);
        for (int j = 0; j < col; ++j)
        {
            std::cout << row[j] << "\t";
        }
        std::cout << "\n";
    }
    std::cout<<fields[0].db<<std::endl;
    std::cout<<fields[0].table<<std::endl;

  1. 释放结果集
 void mysql_free_result(MYSQL_RES *result)
  1. 关闭mysql连接
void mysql_close(MYSQL *sock);

整体示例:

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

const std::string host = "127.0.0.1";
const std::string user = "connector";
const std::string password = "123456";
const std::string db = "conn";
const unsigned int port = 3306;

int main()
{
    // std::cout<<"mysql client version: "<<mysql_get_client_info()<<std::endl;
    MYSQL *my = mysql_init(nullptr);
    if (nullptr == my)
    {
        std::cerr << " init MYSQL error" << std::endl;
        return 1;
    }
    if (mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        std::cerr << " connect MYSQL error" << std::endl;
        return 2;
    }
    mysql_set_character_set(my, "utf8");
    // std::cout<<"connect success "<<std::endl;
    // std::string sql="insert into user(name,age,telphone) values('jim',18,'123488899');";
    // std::string sql="update user set name='李四' where id =2;";
    // std::string sql = "delete from user where id =3; ";
    std::string sql = "select * from user";
    int n = mysql_query(my, sql.c_str());
    if (n == 0)
        std::cout << sql << " success " << std::endl;
    else
    {
        std::cerr << "filed :" << sql << std::endl;
        return 3;
    }
    //把结果存到结果集中
    MYSQL_RES *res = mysql_store_result(my);
    if (nullptr == res)
    {
        std::cerr << " mysql_store_result error" << std::endl;
        return 4;
    }
    my_ulonglong row = mysql_num_rows(res);
    my_ulonglong col = mysql_num_fields(res);
    std::cout << "行: " << row << std::endl;
    std::cout << "列: " << col << std::endl;
    std::cout<<std::endl;

    //属性
    MYSQL_FIELD* fields=mysql_fetch_fields(res);
    for(int i=0;i<col;++i)
    {
        std::cout<< fields[i].name<<"\t";
    }
    std::cout<<std::endl;

    //内容
    for (int i = 0; i < row; ++i)
    {
        MYSQL_ROW row = mysql_fetch_row(res);
        for (int j = 0; j < col; ++j)
        {
            std::cout << row[j] << "\t";
        }
        std::cout << "\n";
    }
    std::cout<<fields[0].db<<std::endl;
    std::cout<<fields[0].table<<std::endl;

    mysql_free_result(res);
    mysql_close(my);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

翻转的乌龟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值