【Linux】嵌入式C语言MySQL编程(libmysqlclient-dev使用)

文章目录

    • 准备工作
    • 相关函数解释
      • C变量类型
      • C语言常用开发接口
        • mysql_init
        • mysql_real_connect
        • mysql_query
        • mysql_store_result
        • mysql_fetch_row
        • mysql_free_result和mysql_close
        • 错误处理
        • 一些辅助函数
    • 实践一下
  • 补充

准备工作

  • 搜索是否包含依赖库
sudo apt-cache search mysqlclient-dev

(显然打错了,是libmysqlclient-dev库)
【Linux】嵌入式C语言MySQL编程(libmysqlclient-dev使用)_第1张图片

  • 安装依赖库
sudo apt install libmysqlclient-dev
  • 查看是否已经安装
sudo apt list --installed |grep libmysqlclient-dev

【Linux】嵌入式C语言MySQL编程(libmysqlclient-dev使用)_第2张图片

  • 查看头文件是否已经包含
find /usr|grep mysql.h

【Linux】嵌入式C语言MySQL编程(libmysqlclient-dev使用)_第3张图片

相关函数解释

C变量类型

MYSQL
表示对一个数据库的连接句柄;
MYSQL_RES
代表返回行的一个查询的(SELECT, SHOW, DESCRIBE, EXPLAIN)的结果。返回的数据称为“数据集”,用过数据库的应该对数据库中查询后得到的结果集不会陌生,在C的API里对应的就是MYSQL_RES了,从数据库读取数据,最后就是从MYSQL_RES中读取数据。
MYSQL_ROW
这是一个行数据的类型安全(type-safe)的表示。当前它实现为一个计数字节的字符串数组。(如果字段值可能包含二进制数据,你不能将这些视为空终止串,因为这样的值可以在内部包含空字节) 行通过调用mysql_fetch_row()获得。
MYSQL_FIELD
这个结构包含字段信息,例如字段名、类型和大小。其成员在下面更详细地描述。你可以通过重复调用mysql_fetch_field()对每一列获得MYSQL_FIELD结构。字段值不是这个结构的部分;他们被包含在一个MYSQL_ROW结构中。
MYSQL
表示对一个数据库的连接句柄;
MYSQL_RES
个结构代表返回行的一个查询的(SELECT, SHOW, DESCRIBE, EXPLAIN)的结果。返回的数据称为“数据集”,用过数据库的应该对数据库中查询后得到的结果集不会陌生,在C的API里对应的就是MYSQL_RES了,从数据库读取数据,最后就是从MYSQL_RES中读取数据。
MYSQL_ROW
这是一个行数据的类型安全(type-safe)的表示。当前它实现为一个计数字节的字符串数组。(如果字段值可能包含二进制数据,你不能将这些视为空终止串,因为这样的值可以在内部包含空字节) 行通过调用mysql_fetch_row()获得。
MYSQL_FIELD
这个结构包含字段信息,例如字段名、类型和大小。其成员在下面更详细地描述。你可以通过重复调用mysql_fetch_field()对每一列获得MYSQL_FIELD结构。字段值不是这个结构的部分;他们被包含在一个MYSQL_ROW结构中。
my_ulonglong
该类型用于行编号和mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()。
该类型用于行编号和mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()。

C语言常用开发接口

mysql_init

原型:MYSQL *mysql_init(MYSQL *mysql)
mysql_init的作用是初始化MYSQL变量,为mysql_real_connect()做准备。
返回值:MYSQL句柄或描述符;内存不足是为NULL;
【Linux】嵌入式C语言MySQL编程(libmysqlclient-dev使用)_第4张图片

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 int client_flag)
说明:
如果port!=0, 则将作为TCP/IP端口使用,为0则使用 表示使用默认端口号3306;
如果unix_socket!=NULL,则可指定socket或命名PIPE,默认为NULL;
client_flag可以指定特定的值(略),默认为0.

mysql_query

功能:执行sql命令 原型: int mysql_query(MYSQL *mysql, const char *query) 说明:
query为数据库操作命令字符串,本义是查询(select),可包括select,update,insert,delete等对数据库操作的命令。
返回值:0表示正常,非0表示发生了错误。
【Linux】嵌入式C语言MySQL编程(libmysqlclient-dev使用)_第5张图片
说明:

  • sprintf:将指令写入缓冲区,动态生成字符串
  • 使用前需要先定义一个缓冲区的数组sqlcommand[]

mysql_store_result

功能:结果集处理。如果使用mysql_query运行的是一个SELECT语句,或其它可以返回结果的查询,可用函数mysql_store_result来访问返回结果并将其保存在一个变量中,以便做进一步处理。
用法:
MYSQL_RES *mysql_store_result(MYSQL *mysql)
MYSQL_RES *mysql_use_result(MYSQL *mysql)
【Linux】嵌入式C语言MySQL编程(libmysqlclient-dev使用)_第6张图片
说明:
mysql为mysql_real_connect函数的返回值。
使用了mysql_store_result函数保存结果后,可以使用以下函数对结果集进行处理。

  • 获得结果集中的行数: my_ulonglong mysql_num_rows(MYSQL_RES *result)
  • 读取结果集中的一行: MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

mysql_fetch_row

获得结果集中的域的属性:
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
获得域属性数组:
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)
查询被update、delete、insert等受影响的行:
my_ulonglong mysql_affected_rows(MYSQL *mysql)
【Linux】嵌入式C语言MySQL编程(libmysqlclient-dev使用)_第7张图片

mysql_free_result和mysql_close

当对数据库使用完毕后,应对所创建的变量等进行释放:
mysql_free_result(result);
mysql_close(&mysql);

错误处理

  • 利用函数的返回值来判断函数执行是否正确。
  • 使用mysql提供的错误号和错误信息:
  1. 错误号: unsigned int mysql_errno(MYSQL *mysql)
  2. 错误信息: char *mysql_error(MYSQL *mysql)

一些辅助函数

获取客户机版本信息:
char *mysql_get_client_info(void)
获取主机信息:
char *mysql_get_host_info(MYSQL *mysql)
获取协议版本信息:
unsigned int mysql_get_proto_info(MYSQL *mysql)
获取服务器版本信息:
char *mysql_get_server_info(MYSQL *mysql)
获取可用数据库列表:
MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)
获取数据库的可有表列表
MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)

实践一下

完整代码

#include 
#include 
#include 
int main(void)
{
    MYSQL com_mysql;//声明一个数据库连接句柄
    char sqlcommand[100];
    MYSQL_RES *pRes;
    MYSQL_ROW hs;
    if(mysql_init(&com_mysql)==NULL)//使用指针寻址,要用到&
    {
            printf("Cannot init mysql!\n");
            return 0;
    }
    if(mysql_real_connect(&com_mysql,"【域名或者主机ip】","【用户名】","【密码】","【数据库名称】",0,NULL,0)==NULL)//相对应替换自己的ip、用户名、密码、数据库
    {
        printf("%s\n",mysql_error(&com_mysql));
        return 0;
    }
    sprintf(sqlcommand,"select *  from student");//写入缓存区,换成自己的表名,这里使用的是student
    if(mysql_query(&com_mysql,sqlcommand)!=0)
    {
        printf("%s\n",mysql_error(&com_mysql));
        return 0;
    }
    if((pRes=mysql_store_result(&com_mysql))==NULL)
    {
        printf("%s\n",mysql_error(&com_mysql));
        return 0;
    }
    while(hs=mysql_fetch_row(pRes))
    {
        //printf("id=%d,age=%d,name=%s\n",hs[0],hs[1],hs[2]);//错:因为mysql_fetch_row已经把字段值转换为字符串了
        printf("id=%s,age=%s,name=%s\n",hs[0],hs[1],hs[2]);
    }
    mysql_free_result(pRes);
    mysql_close(&com_mysql);//善后处理
    return 0;
}

编译:gcc -o mysql mysql.c -lmysqlclient
因为libmysqlclient-dev是第三方库,结尾要加入 -lmysqlclient

补充

suse安装mysqlclient

sudo zypper install libmysqlclient-devel

你可能感兴趣的:(Linux,学习笔记)