zoukankan      html  css  js  c++  java
  • 【Linux】嵌入式C语言MySQL编程(libmysqlclient-dev使用)

    准备工作

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

    (显然打错了,是libmysqlclient-dev库)
    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

    相关函数解释

    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;
    在这里插入图片描述

    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表示发生了错误。
    在这里插入图片描述
    说明:

    • 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)
    在这里插入图片描述
    说明:
    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)
    在这里插入图片描述

    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 <stdio.h>
    #include <string.h>
    #include <mysql/mysql.h>
    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!
    ");
                return 0;
        }
        if(mysql_real_connect(&com_mysql,"【域名或者主机ip】","【用户名】","【密码】","【数据库名称】",0,NULL,0)==NULL)//相对应替换自己的ip、用户名、密码、数据库
        {
            printf("%s
    ",mysql_error(&com_mysql));
            return 0;
        }
        sprintf(sqlcommand,"select *  from student");//写入缓存区,换成自己的表名,这里使用的是student
        if(mysql_query(&com_mysql,sqlcommand)!=0)
        {
            printf("%s
    ",mysql_error(&com_mysql));
            return 0;
        }
        if((pRes=mysql_store_result(&com_mysql))==NULL)
        {
            printf("%s
    ",mysql_error(&com_mysql));
            return 0;
        }
        while(hs=mysql_fetch_row(pRes))
        {
            //printf("id=%d,age=%d,name=%s
    ",hs[0],hs[1],hs[2]);//错:因为mysql_fetch_row已经把字段值转换为字符串了
            printf("id=%s,age=%s,name=%s
    ",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
    
    一键三连呀!
  • 相关阅读:
    P1007 独木桥
    P1789 【Mc生存】插火把
    P2658 汽车拉力比赛
    1959 拔河比赛
    P1936 水晶灯火灵
    websocket
    瀑布流布局
    Router
    图片占位
    单位
  • 原文地址:https://www.cnblogs.com/jee-cai/p/14095199.html
Copyright © 2011-2022 走看看