【Mysql】第十四章 使用C语言链接(环境配置+连接库+sql函数)


文章目录


1.下载库

  • 进入官网Mysql
  • 选择DEVELOPER ZONE
  • 点击MySQL Downloads
  • 选择Download Archives
  • 选择MySQL Connector/C

2.上传库

  • 找到需要存放的库,我建立一个thirdpath库,我的路径/home/aaa/thirdpath/
  • rz -E命令上传下载的库
  • tar -xzf mysql-connector-c-6.1.11-linux-glibc2.12-x86_64.tar.gz//把库解压
  • mv mysql-connector-c-6.1.11-linux-glibc2.12-x86_64 mysql-connector//改名方便
  • cd connector//会发现include(头文件)lib(动静态库)

3.编译库

  • ln -s ~/thirdpath/mysql-connector/include include
  • ln -s ~/thirdpath/mysql-connector/lib lib
  • 在项目的目录下创建上面两个软连接,我的项目是file(路径是/home/aaa/file),我就在file文件夹下创建软连接

通过调用mysql_get_client_info来判断库是否引入成功,该函数的作用就是获取客户端的版本信息,使用的文件test.cc

复制代码
#include <iostream>
#include <mysql.h>
using namespace std;

int main()
{
    //获取客户端的版本信息
    cout<<"mysql client version: "<<mysql_get_client_info()<<endl;

    return 0;
}

编译

复制代码
g++ -o test test.cc -I./include/ -L./lib/ -lmysqlclient

解决libmysqlclient.so.18 => not found

复制代码
echo /home/aaa/thirdpath/mysql-connector/lib > test.conf
sudo cp test.conf /etc/ld.so.conf.d/
ls /etc/ld.so.conf.d/   //发现test.conf就算成功
sudo ldconfig
ldd test //发现libmysqlclient.so.18 =>不是not found就算成功

之后./test成功运行

4.连接库

创建对象-mysql_init

复制代码
MYSQL* mysql_init(MYSQL *mysql);
例如:MYSQL*m1 = mysql_init(NULL);
  • 如果传入的参数是NULL,那么mysql_init将自动为你分配一个MySQL对象并返回。
  • 如果传入的参数是一个地址,那么mysql_init将在该地址处帮你完成初始化。

连接数据库-mysql_real_connect

复制代码
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*m2 = mysql_real_connect(m1,"127.0.0.1", "king", "123456","connect_demon", 3306, NULL, 0);

参数

  • mysql: 调用mysql_init函数创建的MySQL对象。
  • host: MySQL服务器的IP地址,"127.0.0.1"表示本地MySQL服务器。
  • user: MySQL服务器,用户名。
  • passwd: MySQL服务器,用户密码
  • db: MySQL服务器,需要使用的数据库。
  • port: MySQL服务器,对应的端口号。
  • unix_socket: 使用的套接字或命名管道,通常设置为NULL。
  • clientflag: 设置为多个标志位的组合,表示允许特定的功能,通常设置为0。

返回值

  • 如果连接数据库成功,则返回一个MySQL对象,该对象与第一个参数的值相同。
  • 如果连接数据库失败,则返回NULL。

关闭数据库连接-mysql_close

复制代码
void mysql_close(MYSQL *sock);

实例:

复制代码
#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;

const string host = "127.0.0.1";
const string user = "king";
const string passwd = "123456";
const string db = "connect_demon";
const int port = 3306;

int main()
{
    //1、创建MySQL对象
    MYSQL* ms = mysql_init(nullptr);
    //2、连接数据库
    if(mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        cerr<<"数据库连接失败!"<<endl;
        return 1;
    }
    cout<<"数据库连接成功!"<<endl;

    //3、关闭数据库
    mysql_close(ms);
    cout<<"数据库关闭成功!"<<endl;
    return 0;
}

5.sql函数

设置编码格式-mysql_set_character_set

复制代码
int mysql_set_character_set(MYSQL *mysql, const char *csname);
mysql_set_character_set(m1, "utf8"); //设置编码格式为utf8
  • mysql: 表示在连接数据库前,调用mysql_init函数创建的MySQL对象。
  • csname: 表示要设置的编码格式,如"utf8"
  • 返回值为0表示设置成功,否则表示设置失败。

发送请求-mysql_query

复制代码
int	mysql_query(MYSQL *mysql, const char *q);
例如:
string sql = "insert into user values (4,'赵六',25)";
mysql_query(m1, sql.c_str());
  • mysql: 表示在连接数据库前,调用mysql_init函数创建的MySQL对象。
  • q: 表示向MySQL服务器下发的SQL请求,SQL最后可以不带分号。
  • 返回值为0表示SQL执行成功,否则表示SQL执行失败。

获取查询结果-mysql_store_result

复制代码
MYSQL_RES* mysql_store_result(MYSQL *mysql);
例如:
MYSQL_RES* res = mysql_store_result(m1);
free(m1);
  • 查询结果保存到MYSQL_RES指针中进行返回
  • MYSQL_RES指针的内存空间是malloc出来,使用完后需要调用free函数进行释放

获取查询结果的行数-mysql_num_rows

复制代码
my_ulonglong mysql_num_rows(MYSQL_RES *res);
例如:
int rows = mysql_num_rows(res); //数据的行数

获取查询结果中的一行数据-mysql_fetch_row

复制代码
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
例如:
MYSQL_ROW row = mysql_fetch_row(res);//获取一行数据

注意:MYSQL_ROW本质就是char**类型

获取查询结果的列数-mysql_num_fields

复制代码
unsigned int mysql_num_fields(MYSQL_RES *res);
例如:
int cols = mysql_num_fields(res); //数据的列数

获取查询结果的列属性-mysql_fetch_fields

复制代码
MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES *res);
例如:
MYSQL_FIELD* fields = mysql_fetch_fields(res);//获取每列的属性

实例

复制代码
#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;

const string host = "127.0.0.1";
const string user = "king";
const string passwd = "123456";
const string db = "connect_demon";
const int port = 3306;

int main()
{
    //1、获取MySQL实例(相当于给我们创建了一个MySQL句柄)
    MYSQL* ms = mysql_init(nullptr);
    //2、连接数据库
    if(mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        cerr<<"数据库连接失败!"<<endl;
        return 1;
    }
    cout<<"数据库连接成功!"<<endl;
    mysql_set_character_set(ms, "utf8"); //设置编码格式为utf8
    
    //3、查询数据库表中的记录
    //a、执行查询语句
    std:string sql = "select * from user";
    if(mysql_query(ms, sql.c_str()) != 0)
    {
        cout<<"查询数据失败!"<<endl;
        return 2;
    }
    cout<<"查询数据成功!"<<endl;
    //b、获取查询结果
    MYSQL_RES* res = mysql_store_result(ms);
    int rows = mysql_num_rows(res); //数据的行数
    int cols = mysql_num_fields(res); //数据的列数
    //获取每列的属性并打印列名
    MYSQL_FIELD* fields = mysql_fetch_fields(res);
    for(int i = 0;i < cols;i++)
    {
        cout<<fields[i].name<<"\t";
    }
    cout<<endl;
    for(int i = 0;i < rows;i++)
    {
        //获取一行数据并进行打印
        MYSQL_ROW row = mysql_fetch_row(res);
        for(int j = 0;j < cols;j++)
        {
            cout<<row[j]<<"\t";
        }
        cout<<endl;
    }
    free(res); //释放内存空间
    
    //4、关闭数据库
    mysql_close(ms);
    cout<<"数据库关闭成功!"<<endl;
    return 0;
}

相关推荐
水水沝淼㵘6 分钟前
嵌入式开发学习日志(数据结构--顺序结构单链表)Day19
linux·服务器·c语言·数据结构·学习·算法·排序算法
脑子慢且灵26 分钟前
MySQL:关系模型的基本理论
数据库·sql·mysql
yutian060628 分钟前
C语言中的宏
c语言·开发语言
敲上瘾41 分钟前
MySQL基本查询
数据库·mysql·数据库开发·数据库架构·数据库系统
JANYI20181 小时前
C语言易混淆知识点详解
java·c语言·算法
葵花日记1 小时前
数据结构——二叉树
c语言·数据结构
敲上瘾2 小时前
MySQL数据库表的约束
linux·数据库·sql·mysql·数据库开发·数据库架构·数据库系统
努力的搬砖人.2 小时前
SQLite 转换为 MySQL 数据库
数据库·mysql·sqlite
越城2 小时前
数据结构中的栈与队列:原理、实现与应用
c语言·数据结构·算法
似水এ᭄往昔2 小时前
【数据结构】——栈和队列OJ
c语言·数据结构·c++