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