libmysql使用详解


一、环境安装

ubuntu环境下需安装:libmysqlclient-dev,安装指令:

apt-get install libmysqlclient-dev

在/usr/include/mysql/目录下的 mysql.h 是主要的 API 接口头文件。编码时我们需要引用该头文件。


二、主要函数


1、 MYSQL * mysql_init(MYSQL * mysql)

说明:
分配或初始化与 mysql_real_connect()相适应的 MYSQL 对象。 如果 mysql 是 NULL指针, 该函数将分配、 初始化、 并返回新对象。 否则, 将初始化对象, 并返回对象的地址。 如果 mysql_init()分配了新的对象, 当调用 mysql_close()来关闭连接时。 将释放该对象。


参数:
mysql取值有两种情况(一般都采用第1)种方法):
1)参数传 NULL 值
mysql_init() 函数内部申请了一片内存, 然后返回了首地址。

2)参数传对象地址
使用栈内存, mysql_init() 函数显然不应该给分配堆内存。


返回值:
初始化的 MYSQL*句柄。 如果无足够内存以分配新的对象, 返回 NULL。


2、 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 long client_flag)

说明:
mysql_real_connect()尝试与运行在主机上的 MySQL 数据库引擎建立连接。 在你能够 执 行 需 要 有 效 MySQL 连 接 句 柄 结 构 的 任 何 其 他 API 函 数 之 前 ,mysql_real_connect()必须成功完成。


参数:

  • mysql: MYSQL 结构的地址。 调用 mysql_real_connect()之前, 必须调用mysql_init()来初始化 MYSQL 结构。
  • host: 必须是主机名或 IP 地址。 如果“ host” 是 NULL 或字符串"localhost", 连接将被视为与本地主机的连接。
  • passwd: 用户的密码。 如果“passwd” 是 NULL, 仅会对该用户的( 拥有 1 个空密码字段的) 用户表中的条目进行匹配检查。 这样, 数据库管理员就能按特定的方式设置 MySQL 权限系统, 根据用户是否拥有指定的密码, 用户将获得不同的权限。
  • db: 数据库名称。 如果 db 为 NULL, 连接会将默认的数据库设为该值。
  • port: 如果“port” 不是 0, 其值将用作 TCP/IP 连接的端口号。 注意, “host”参数决定了连接的类型。
  • unix_socket: 如果 unix_socket 不是 NULL, 该字符串描述了应使用的套接字或命名管道。 注意, “host” 参数决定了连接的类型。
  • client_flag: 通常为 0, 但是, 也能将其设置为下述标志的组合, 以允许特定功能:
    在这里插入图片描述


返回值:
如果连接成功, 返回 MYSQL*连接句柄。 如果连接失败, 返回 NULL。 对于成功的连接, 返回值与第 1 个参数的值相同。


错误码:

  • CR_CONN_HOST_ERROR:无法连接到 MySQL 服务器。
  • CR_CONNECTION_ERROR:无法连接到本地 MySQL 服务器。
  • CR_IPSOCK_ERROR:无法创建 IP 套接字。
  • CR_OUT_OF_MEMORY:内存溢出。
  • CR_SOCKET_CREATE_ERROR:无法创建 Unix 套接字。
  • CR_UNKNOWN_HOST:无法找到主机名的 IP 地址。
  • CR_VERSION_ERROR:协议不匹配, 起因于: 试图连接到具有特定客户端库( 该客户端库使用了不同的协议版本) 的服务器。 如果使用很早的客户端库来建立与较新的服务器( 未使用“ --old-protocol” 选项开始的) 的连接, 就会出现该情况。
  • CR_NAMEDPIPEOPEN_ERROR:无法在 Windows 平台下创建命名管道。
  • CR_NAMEDPIPEWAIT_ERROR:在 Windows 平台下等待命名管道失败。
  • CR_NAMEDPIPESETSTATE_ERROR:在 Windows 平台下获取管道处理程序失败。
  • CR_SERVER_LOST:如果 connect_timeout> 0, 而且在连接服务器时所用时间长于 connect_timeout秒, 或在执行 init-command 时服务器消失。


3、int mysql_query(MYSQL * mysql, const char * stmt_str)

说明:
mysql_query() 向与指定的连接标识符关联的服务器中的当前活动数据库发送一条查询, 如果没有指定 link_identifier, 则使用上一个打开的连接。 如果没有打开的连接, 本函数会尝试无参数调用 mysql_connect() 函数来建立一个连接并使用之。查询结果会被缓存。

参数:
mysql: mysql_init 函数返回的指针。
stmt_str: 查询语句。

返回值:
成功返回 0, 如果发生错误返回非 0.

错误:

  • CR_COMMANDS_OUT_OF_SYNC:命令的执行顺序不正确。
  • CR_SERVER_GONE_ERROR:MySQL 服务器已经消失了。
  • CR_SERVER_LOST:查询期间与服务器的连接丢失。
  • CR_UNKNOWN_ERROR:发生未知错误。


4、 MYSQL_RES * mysql_use_result(MYSQL * mysql)

说明:
对于成功检索数据的每个查询( SELECT、 SHOW、 DESCRIBE、 EXPLAIN) , 必须调用 mysql_store_result()或 mysql_use_result()。 mysql_use_result()将初始化结果 集检索, 但并不像 mysql_store_result()那样将结果集实际读取到客户端。 它必须通过对 mysql_fetch_row()的调用, 对每一行分别进行检索。这将直接从服务器读取结果,而不会将其保存在临时表或本地缓冲区内, 与 mysql_store_result()相比, 速度更快而且使用的内存也更少。 客户端仅为当前行和通信缓冲区分配内存, 分配的内存可增加到 max_allowed_packet 字节。

参数:
mysql: mysql_init 函数返回的指针。

返回值:

  • MYSQL_RES 结果结构。 如果出现错误, 返回 NULL。


5、 MYSQL_RES * mysql_store_result(MYSQL * mysql)

说明:
对于成功检索了数据的每个查询( SELECT、 SHOW、 DESCRIBE、 EXPLAIN、 CHECK TABLE等) , 必须调用 mysql_store_result()或 mysql_use_result() 。 对于其他查询, 不需要调用 mysql_store_result()或 mysql_use_result(), 但是如果在任何情况下均调用了mysql_store_result() , 它 也 不 会 导 致 任 何 伤 害 或 性 能 降 低 。 通 过 检 查mysql_store_result()是否返回 0, 可检测查询是否没有结果集( 以后会更多) 。如果希望了解查询是否应返回结果集, 可使用 mysql_field_count()进行检查。“ mysql_field_count()” 。 mysql_store_result()将查询的全部结果读取到客户端, 分配 1 个 MYSQL_RES 结构, 并将结果置于该结构中。

如果查询未返回结果集, mysql_store_result()将返回 Null 指针( 例如, 如果查询是 INSERT 语句)。 如果读取结果集失败, mysql_store_result()还会返回 Null 指针。通过检查 mysql_error()是否返回非空字符串, mysql_errno()是否返回非 0 值, 或mysql_field_count()是否返回 0, 可以检查是否出现了错误。 如果未返回行, 将返回空的结果集。 (空结果集设置不同于作为返回值的空指针) 。 一旦调用了mysql_store_result()并获得了不是 Null 指针的结果, 可调用mysql_num_rows()来找出结果集中的行数。
可以调用 mysql_fetch_row()来获取结果集中的行, 或调用 mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。 一旦完成了对结果集的操作, 必须调用 mysql_free_result()。

参数:
mysql: mysql_init 函数返回的指针。

返回值:

  • 具有多个结果的 MYSQL_RES 结果集合。 如果出现错误, 返回 NULL。


6、MYSQL_ROW mysql_fetch_row(MYSQL_RES * result)

说明:
检索一个结果集合的下一行。 当在 mysql_store_result()之后使用时, 如果没有更多的行可检索时, mysql_fetch_row()返回 NULL。 当在 mysql_use_result()之后使用时,当没有更多的行可检索时或如果出现一个错误, mysql_fetch_row()返回 NULL。在行中值的数量由 mysql_num_fields(result)给出。 如果 row 保存了从一个对用mysql_fetch_row() 调 用 返 回 的 值 , 指 向 该 值 的 指 针 作 为 row[0] 到row[mysql_num_fields(result)-1]来存取。 在行中的 NULL 值由 NULL 指针指出。在行中字段值的长度可以通过调用 mysql_fetch_lengths()获得。 空字段和包含 NULL的字段长度都是 0; 你可以通过检查该值的指针区分他们。 如果指针是 NULL, 字段是 NULL; 否则字段是空的。

参数:
result: 返回一个结构为MYSQL_ROW的下一行结果, 如果没有要检索的行或发生错误, 则返回 NULL。

返回值:
返回一个结构为 MYSQL_ROW 的下一行结果, 如果没有要检索的行或发生错误, 则返回 NULL。

错误:
调用 mysql fetch_row()之间不会重置错误

  • CR_SERVER_LOST:查询期间与服务器的连接丢失。
  • CR_UNKNOWN_ERROR:发生未知错误。


7、 void mysql_free_result(MYSQL_RES * result)

说明:
释放由 mysql_store_result(), mysql_use_result(), mysql_list_dbs()等为结果集分配的内存。 使用完结果集后, 必须通过调用 mysql_free_result()释放它使用的内存。释放结果集后不要尝试访问该结果集。

参数:
result: 结果集


8、void mysql_close(MYSQL * mysql);

说明:
关闭以前打开的连接。 如果处理程序是由 mysql_init()或 mysql_connect()自动分配的, mysql_close()还会释放 mysql 指向的连接处理程序。

参数:
mysql: mysql_init 函数返回的指针。


三、应用示例

#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
	MYSQL *conn;
	MYSQL_RES *res;
	MYSQL_ROW row;
	char server[] = "localhost";
	char user[] = "lingsheng_mysql";
	char password[] = "lingsheng";
	char database[] = "mysql";
	conn = mysql_init(NULL);
	if (!mysql_real_connect(conn, server,user, password, database, 0, NULL, 0))
	{
		fprintf(stderr, "%s\n", mysql_error(conn));
		exit(1);
	} 
	if (mysql_query(conn, "show tables"))
	{
		fprintf(stderr, "%s\n", mysql_error(conn));
		exit(1);
	} 
	res = mysql_use_result(conn);
	printf("MySQL Tables in mysql database:\n");
	while ((row = mysql_fetch_row(res)) != NULL)
	{
		printf("%s \n", row[0]);
	}
	mysql_free_result(res);
	mysql_close(conn);
	printf("finish! \n");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值