【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;
}

相关推荐
Hello.Reader4 分钟前
Redis热点数据管理全解析:从MySQL同步到高效缓存的完整解决方案
redis·mysql·缓存
是程序喵呀35 分钟前
MySQL备份
android·mysql·adb
stm 学习ing40 分钟前
HDLBits训练5
c语言·fpga开发·fpga·eda·hdlbits·pld·hdl语言
指尖上跳动的旋律43 分钟前
shell脚本定义特殊字符导致执行mysql文件错误的问题
数据库·mysql
lucky_syq2 小时前
Hive SQL和Spark SQL的区别?
hive·sql·spark
就爱学编程2 小时前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
北国无红豆2 小时前
【CAN总线】STM32的CAN外设
c语言·stm32·嵌入式硬件
单片机学习之路3 小时前
【C语言】结构
c语言·开发语言·stm32·单片机·51单片机
graceyun4 小时前
C语言初阶习题【9】数9的个数
c语言·开发语言
苹果醋35 小时前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx