mysql 嵌入式 c开发环境_【Linux】嵌入式C语言MySQL编程(libmysqlclient-dev使用)

本文介绍了在Linux环境下使用C语言进行MySQL数据库编程的方法,包括安装libmysqlclient-dev库,理解MYSQL、MYSQL_RES、MYSQL_ROW和MYSQL_FIELD等数据类型,以及使用mysql_init、mysql_real_connect、mysql_query等接口进行数据库操作。还提供了错误处理和实践代码示例。
摘要由CSDN通过智能技术生成

文章目录

准备工作

相关函数解释

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库)

1b7ae0085148ab50b585e2a05b9a579c.png

安装依赖库

sudo apt install libmysqlclient-dev

查看是否已经安装

sudo apt list --installed |grep libmysqlclient-dev

722c7e8511796340b9adfc3ace97b034.png

查看头文件是否已经包含

find /usr|grep mysql.h

0991c2f6790c3995099b2320eb5ed578.png

相关函数解释

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;

f0f37967bed2e6483a92a3bc2db4d4bf.png

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表示发生了错误。

419562f1113de110d8a6ba0ec264f21f.png

说明:

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)

ad277abab6e088944f873bcba2906f60.png

说明:

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)

f36e64a3e9039d06fe6f5f85df550706.png

mysql_free_result和mysql_close

当对数据库使用完毕后,应对所创建的变量等进行释放:

mysql_free_result(result);

mysql_close(&mysql);

错误处理

利用函数的返回值来判断函数执行是否正确。

使用mysql提供的错误号和错误信息:

错误号: unsigned int mysql_errno(MYSQL *mysql)

错误信息: 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值