MySQL之C语言API学习小结

当我们在项目中需要用C语言和MySQL数据库进行交互时,可以使用基于C语言的MySQL接口来进行对数据的增、删、改、查等操作。这篇文章将从基于C的MySQL接口及示例做相关学习和总结。

1.MySQL C语言API相关数据类型

(1)MYSQL结构体

对一个数据库进行操作之前,必须进行连接,该数据结构是创建连接所必要的句柄,其实质是一个结构体,包含的内容较多,了解一下即可:

(2)MYSQL_RES结构体

函数mysql_store_result和mysql_use_result的返回类型就是MYSQL_RES,该结构体中包含了查询的结果集:

(3)MYSQL_ROW

该变量是对结果集中的一行数据的类型安全的表示,其实质就是一个指向char类型的二级指针:

并且,函数mysql_fetch_row的返回类型就是MYSQL_ROW。(其形参类型是MYSQL_RES *)

(4)MYSQL_FIELD结构体

该结构体描述了数据库中表字段的各种信息:

并且,函数mysql_fetch_field和mysql_fetch_fields返回类型就是MYQL_FIELD *。前者返回表的下一个字段,后者返回表的所有字段的数组。

2.MySQL C语言API

(1)mysql_init

原型:MYSQL * STDCALL  mysql_init(MYSQL *mysql);

功能:初始化MYSQL结构

返回值:成功返回MYSQL句柄;失败返回NULL。

其中关键字STDCALL是一个宏定义:#define STDCALL __stdcall,而__stdcall是函数调用约定的一种,被这个关键字修饰的函数,其参数都是从右向左通过堆栈传递的, 函数调用在返回前要由被调用者清理堆栈。

(2)mysql_options

原型:int STDCALL mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg);

功能:为mysql_real_connect设置连接选项

返回值:成功返回0;如果指定了一个位置选项,返回非0

其中,第二个参数是一个枚举型,里面包含了众多选项,可参考mysql.h头文件。

(3)mysql_real_connect

原型:
MYSQL * STDCALL 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 long clientflag);

功能:连接到MySQL服务器。

返回值:成功返回一个连接的MYSQL句柄;失败返回NULL。

注:原mysql_connect函数已经被mysql_real_connect函数取代了。

(4)mysql_query

原型:int STDCALL mysql_query(MYSQL *mysql, const char *q);

功能:执行以“NULL结束”的字符串SQL查询

返回值:成功返回0;失败返回非零

(5)mysql_real_query

原型:int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);

功能:执行以“指定长度”的字符串SQL查询

返回值:成功返回0;失败返回非0

(6)mysql_errno

原型:unsigned int STDCALL mysql_errno(MYSQL *mysql);

功能:返回上一次调用MySQL函数的错误编号

返回值:返回上次调用接口出错的错误编号;返回0表示上次调用正常

(7)mysql_ping

原型:int STDCALL mysql_ping(MYSQL *mysql);

功能:检查与服务器的连接是否正常,如有必要重新连接

返回值:连接正常返回0;连接异常返回非零

(8)mysql_store_result

原型:MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);

功能:将检索完整的结果集返给客户端(Retrieves a complete result set to the client)

返回值:成功返回类型为MYSQL_RES*的结果集;失败返回NULL

(9)mysql_num_rows

原型:my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *result);

功能:返回结果集中的行数

返回值:返回结果集中的行数

其中返回类型有:typedef unsigned long my_ulonglong;

(10)mysql_free_result

原型:void STDCALL mysql_free_result(MYSQL_RES *result);

功能:释放结果集使用的内存

返回值:无返回值

(11)mysql_fetch_row

原型:MYSQL_ROW STDCALL mysql_fetch_row(MYSQL _RES *result);

功能:从结果集中获取下一行

返回值:返回下一行MYSQL_ROW结构;出错或者结果集中没有更多的内容时返回NULL

(12)mysql_num_fields

原型:unsigned int STDCALL mysql_num_fields(MYSQL_RES *result);

功能:返回结果集中的列数

返回值:返回结果集中的列数

(13)mysql_fetch_field

原型:MYSQL_FIELD * STDCALL mysql_fetch_field(MYSQL_RES *result);

功能:返回下一表字段类型

返回值:返回当前字段的MYSQL_FIELD结构体;没有更多的字段返回NULL

(14)mysql_fetch_fields

原型:MYSQL_FIELD *STDCALL mysql_fetch_fields(MYSQL_RES *result);

功能:返回所有字段结构的数组

返回值:返回结果集中所有字段的MYSQL_FIELD结构体数组

(15)mysql_close

原型:void STDCALL mysql_close(MYSQL *mysql);

功能:关闭连接

返回值:无返回值

3.示例

首先,在数据库“dulishu”中创建一个“student”表,并插入两条内容,如下所示:

编写如下示例程序:

编译运行:

示例中展示了C语言调用MySQL接口的一个简单的示例,并没有对函数调用进行错误判断等操作。实际项目中可能要更为复杂,比如使用mysql_errno函数对调用结果进行错误判断,设计数据库结构体将查询结果存入,或从数据库结构体中读入数据去更新表的内容等等。

并且,文中只列举了几个基础的接口函数,其他函数可以参考MySQL官方文档,地址如下:
https://dev.mysql.com/doc/refman/5.7/en/c-api-function-overview.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注