27.7.5 C API 函数概述

下 table 总结了 C API 中可用的功能。有关更多详细信息,请参见第 27.7.6 节“ C API 函数描述”中的描述。

应用程序应使用以下概述与 MySQL 进行交互:

  • 通过调用mysql_library_init()初始化 MySQLClient 端库。该函数同时存在于libmysqlclient CClient 端库和libmysqld嵌入式服务器库中,因此无论是通过与-libmysqlclient标志链接来构建常规 Client 端程序,还是通过与-libmysqld标志链接来构建嵌入式服务器应用程序,都可以使用该函数。

  • 通过调用mysql_init()初始化连接处理程序,并通过调用mysql_real_connect()连接到服务器。

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

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

  • 通过调用mysql_library_end()结束对 MySQLClient 端库的使用。

调用mysql_library_init()mysql_library_end()的目的是提供 MySQLClient 端库的正确初始化和完成。对于与 Client 端库链接的应用程序,它们提供了改进的内存 Management。如果不调用mysql_library_end(),则会保留一块内存。 (这不会增加应用程序使用的内存量,但是某些内存泄漏检测器会抱怨它.)对于与嵌入式服务器链接的应用程序,这些调用会启动和停止服务器。

在非多线程环境中,可以省略对mysql_library_init()的调用,因为mysql_init()将根据需要自动调用它。但是,mysql_library_init()在多线程环境中不是线程安全的,因此mysql_init()也不是,它调用mysql_library_init()。无论是调用mysql_library_init()还是间接通过mysql_init(),都必须在生成任何线程之前调用mysql_library_init(),或者使用 Mutex 来保护该调用。这应该在任何其他 Client 端库调用之前完成。

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

连接后,mysql_real_connect()reconnect标志(MYSQL结构的一部分)设置为0的值。您可以对mysql_options()使用MYSQL_OPT_RECONNECT选项来控制重新连接行为。如果将标志设置为1,则会导致 Client 端在由于丢失连接而无法执行语句之前尝试重新连接到服务器。

连接处于活动状态时,Client 端可以使用mysql_query()mysql_real_query()将 SQL 语句发送到服务器。两者之间的区别在于mysql_query()期望将查询指定为以空值结尾的字符串,而mysql_real_query()期望将计数的字符串指定为。如果字符串包含二进制数据(可能包含空字节),则必须使用mysql_real_query()

对于每个非SELECT查询(例如INSERTUPDATEDELETE),您可以通过调用mysql_affected_rows()来查找更改(受影响)的行数。

对于SELECT查询,您将检索选定的行作为结果集。 (请注意,某些语句类似于SELECT,它们返回行。其中包括SHOWDESCRIBEEXPLAIN。与SELECT语句一样对待这些语句。)

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

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

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

两种检索机制是互补的。选择最适合每个 Client 端应用程序的方法。实际上,Client 倾向于更常见地使用mysql_store_result()

mysql_store_result()的优点是,因为所有行都已提取到 Client 端,所以您不仅可以 Sequences 访问行,还可以使用mysql_data_seek()mysql_row_seek()在结果集中来回移动以更改结果集中的当前行位置。您还可以通过调用mysql_num_rows()找出多少行。另一方面,对于较大的结果集,mysql_store_result()的内存要求可能很高,并且您更有可能遇到内存不足的情况。

mysql_use_result()的一个优点是 Client 端需要较少的内存来存储结果集,因为它一次只能维护一行(并且由于分配开销较小,因此mysql_use_result()可以更快)。缺点是您必须快速处理每一行以避免阻塞服务器,您不能随机访问结果集中的行(只能 Sequences 访问行),并且直到您知道结果集中的行数为止都找回了。此外,即使您在检索中确定您已找到所需的信息,也必须*检索所有行。

该 API 使 Client 端可以在不知道该语句是否为SELECT的情况下适当地响应该语句(仅在必要时检索行)。您可以通过在每个mysql_query()(或mysql_real_query())之后调用mysql_store_result()来实现。如果结果集调用成功,则该语句为SELECT,您可以读取行。如果结果集调用失败,则调用mysql_field_count()来确定结果是否实际上是预期的。如果mysql_field_count()返回零,则该语句不返回任何数据(table 明它是INSERTUPDATEDELETE等),并且不希望返回任何行。如果mysql_field_count()不为零,则该语句应返回行,但不是。这 table 明该语句是SELECT失败。有关如何执行此操作的示例,请参见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()函数提供对错误信息的访问。它们为成功或失败的最近调用的函数返回错误代码或错误消息,使您能够确定何时发生错误以及发生了什么错误。