10bet网址
MySQL 8.0 C API开发人员指南
下载本手册

5.1 C API基本接口概述

应用程序应使用此常规轮廓通过客户端库与MySQL进行交互:

  1. 初始化MySQL客户端库调用mysql_library_init()

  2. 通过调用初始化连接处理程序mysql_init ()并通过调用连接建立函数连接到服务器,例如mysql_real_connect()

  3. 发出SQL语句并处理其结果。(以下讨论提供了有关如何执行此操作的更多信息。)

  4. 通过调用关闭与MySQL服务器的连接mysql_close()

  5. 最终使用MySQL客户端库进行调用mysql_library_end ()

召唤的目的mysql_library_init()mysql_library_end ()是提供MySQL客户端库的正确初始化和最终确定。对于与客户端库链接的应用程序,它们提供了改进的内存管理。如果你不打电话mysql_library_end (),一个内存块仍然被分配。(这不会增加应用程序使用的内存量,但是一些内存泄漏检测器会对此提出抱怨。)

在一个非含义的环境中,呼叫mysql_library_init()可以省略,因为mysql_init ()将在必要时自动调用它。然而,mysql_library_init()在多线程环境中是否线程安全,因此也不是mysql_init (),呼叫mysql_library_init().你必须呼叫mysql_library_init()在生成任何线程之前,或者使用互斥锁来保护调用,无论您是否调用mysql_library_init()或间接通过mysql_init ().这应该在任何其他客户端库呼叫之前完成。

要连接到服务器,请致电mysql_init ()初始化连接处理程序,然后调用连接建立功能,例如mysql_real_connect()使用该处理程序(以及其他信息,如主机名,用户名和密码)。当您完成连接时,请致电mysql_close()终止它。关闭处理程序后不要使用它。

连接时,mysql_real_connect()设置重新联系标志(部分mysql.结构)到一个值0..你可以使用MYSQL_OPT_RECONNECT选项mysql_options()控制重连接行为。将旗标设置为1如果由于失去连接而无法执行语句,在放弃之前,导致客户端尝试重新连接到服务器。

当连接处于活动状态时,客户端可以使用SQL语句将SQL语句发送到服务器mysql_real_query()mysql_query ().两者之间的区别是mysql_query ()预计查询将被指定为空终止字符串,而mysql_real_query()期待一个计数的字符串。如果字符串包含二进制数据(可能包含空字节),则必须使用mysql_real_query()

对于每个非选择查询(例如,插入更新删除),您可以通过调用来了解已更改了多少行(受影响)mysql_affected_rows ()

为了选择查询时,检索所选行作为结果集。(注意,有些语句是选择它们的返回行。这些包括表演描述,解释.以同样的方式对待这些陈述选择陈述。)

客户端处理结果集有两种方法。一种方法是通过呼叫来检索整个结果集全部mysql_store_result().此函数从服务器获取查询返回的所有行并将其存储在客户端中。第二种方式是客户端通过调用来启动逐行结果集检索mysql_use_result().这个函数初始化检索,但实际上不从服务器获取任何行。

在这两种情况下,您可以通过呼叫访问行mysql_fetch_row().与mysql_store_result()mysql_fetch_row()访问以前从服务器获取的行。与mysql_use_result()mysql_fetch_row()实际上从服务器中检索行。有关每行中数据大小的信息可通过调用来使用mysql_fetch_lengths ()

完成结果集后,调用mysql_free_result()释放用于它的内存。

两个检索机制是互补的。选择最适合每个客户端应用程序的方法。在实践中,客户往往使用mysql_store_result()更常见。

一个优势mysql_store_result()是不是因为所有的行都已被提取到客户端,您不仅可以按顺序访问行,还可以在结果集中来回移动使用mysql_data_seek ()mysql_row_seek()更改结果集中的当前行位置。您还可以通过调用来确定有多少行mysql_num_rows ().另一方面,内存需求为mysql_store_result()对于较大的结果集,可能非常高,并且您更可能遇到内存不足的情况。

一个优势mysql_use_result()是客户端需要较少的内存来为结果集较少,因为它一次只维护一行(并且因为较少的分配开销,mysql_use_result()可以更快)。缺点是你必须迅速处理每一行,以避免占用服务器,你没有随机存取在结果集行(你只能访问顺序行),并在结果集中的行数是未知的,直到你有检索。此外,你必须即使您在中间检索中确定您发现的信息,也可以检索所有行。

该API使客户端能够适当地响应语句(仅在必要时检索行),而不知道语句是否是选择.你可以通过致电来完成这件事mysql_store_result()在每一个mysql_real_query()(或者mysql_query ()).如果结果集调用成功,则语句为选择你可以读取行。如果结果集呼叫失败,请致电mysql_field_count()确定结果是否预期。如果mysql_field_count()返回零,该语句返回没有数据(表示它是一个插入更新删除等等),并未预料到返回行。如果mysql_field_count()为非零时,语句应该返回行,但没有。这表明语句是选择,失败了。参见描述mysql_field_count()为了说明如何做到这一点。

这两个mysql_store_result()mysql_use_result()使您能够获得关于组成结果集的字段的信息(字段的数量、它们的名称和类型,等等)。可以通过调用顺序访问行中的字段信息mysql_fetch_field()通过呼叫重复或排行的字段号mysql_fetch_field_direct ().可以通过呼叫来改变当前的场光标位置mysql_field_seek().设置字段游标会影响后续调用mysql_fetch_field().您还可以通过调用一次性获得所有字段的信息mysql_fetch_fields()

为了检测和报告错误,MySQL通过借助于的信息提供对错误信息的访问mysql_errno ()mysql_error ()功能。它们返回最近调用的函数的错误代码或错误消息,该函数可以成功或失败,使您能够确定错误何时发生以及是什么。