使用C语言编程访问MySQL数据库执行SQL语句方法详解

栏目:技术文章 发布时间:2026-04-16 09:25
本文通过实例解析了MySQL C接口操作核心逻辑,重点展示了非返回型语句(UPDATE/DELETE/INSERT)的执行机制与返回值处理,以及SELECT查询结果集的存储与逐行获取技术,为数据库开发提供清晰的编程参考。

与PostgreSQL相似,可使用许多不同的语言来访问MySQL,包括C、C++、Java和Perl。从下列章节中,Neil Matthew和Richard Stones使用详尽的MySQL C接口向我们介绍了如何在MySQL数据库中执行SQL语句。他们将讨论返回数据的语句,例如INSERT以及不返回数据的语句,例如UPDATE和 DELETE。然后,他们将编写从数据库检索数据的简单程序。

现在,我们已经有了一个连接,并且知道如何处理错误,是时候讨论使用我们的数据库来作一些实际工作了。执行所有类型的SQL的主关键字是mysql_query:

正如您所见,它非常简单。它取一个指向连接结构的指针和包含要执行的SQL的文本字符串;与命令行工具不同,将不使用结束分号。成功之后,返回0。在需要包含二进制数据的特殊情况下,可以使用相关的函数,mysql_real_query。虽然出于本章的目的,我们仅需要讨论mysql_query。

我们将先讨论UPDATE、DELETE和INSERT语句。因为它们不返回数据,所以更易于使用。

可能关于这一函数的最显而易见的事就是其非同寻常的返回结果。由于可移植性原因,这是一个特殊的无符号类型。为了在printf中使用,建议将其强制转换成使用%lu格式规范的无符号长整数。这个函数返回受以前的UPDATE、INSERT或DELETE查询影响的行数,这些查询是使用 mysql_query执行的。

正如预期,插入的行数为1。

现在假设子表中有的数据,如下:

如果我们执行update1,希望报告的受影响行数为4,但是实际上程序报告2,因为它仅必须更改2行,虽然WHERE子句标识了4行。如果想让 mysql_affected_rows报告的结果为4这可能是熟悉其它数据库的人所期望的),则需要记住将CLIENT_FOUND_ROWS标志传递到mysql_real_connect,在 update2.c中的程序如下:

如果我们在数据库中复位数据,然后运行带有这种修改的程序,则它报告的行数为4。

现在是时候讨论SQL的最普遍用法了,从数据库检索数据的SELECT语句。

可以从SELECT语句(或其他返回数据的语句)中检索完所有数据,在单一调用中,使用mysql_store_result:

必须在mysql_query检索数据后才能调用这个函数,以在结果集中存储该数据。这个函数从服务器中检索所有数据并立即将它存储在客户机中。它返回一个指向以前我们从未遇到过的结构(结果集结构)的指针。如果语句失败,则返回NULL。

使用C语言编程访问MySQL数据库执行SQL语句方法详解(图1)

它从mysql_store_result取得返回的结果结构,并且在该结果集中返回行数,行数可能为0。如果mysql_store_result成功,则mysql_num_rows也总是成功的。

这个函数采用从存储结果中获取的结果结构,并且从中检索单一行,在行结构中返回分配给您的数据。当没有更多数据或者发生错误时,返回NULL。稍后,我们将回来处理这一行中的数据。

这个函数允许您进入结果集,设置将由下一个获取操作返回的行。Offset是行号,它必须在从0到结果集中的行数减 1 的范围内。传递0将导致在下一次调用mysql_fetch_row时返回第一行。

这个函数返回一个偏移值,它表示结果集中的当前位置。它不是行号,不能将它用于mysql_data_seek。但是,可将它用于:

它移动结果集中的当前位置,并返回以前的位置。

完成结果集时, 必须总是调用这个函数,以允许MySQL库整理分配给它的对象。

  检索数据

检索结果集并循环通过已检索的数据的重要部分都已突出显示。

要按需要逐行检索数据,而不是立即获取全部数据并将它存储在客户机中,可以将mysql_store_result调用替换成 mysql_use_result:


MYSQL_RES *mysql_use_result(MYSQL *connection);