700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > mysql 嵌入式 c开发环境_【Linux】嵌入式C语言MySQL编程(libmysqlclient-dev使用)

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

时间:2024-08-28 06:12:54

相关推荐

mysql 嵌入式 c开发环境_【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库)

安装依赖库

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提供的错误号和错误信息:

错误号: 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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。