手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Mysql>列表

在MySQL数据库中使用C执行SQL语句

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!



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

函数mysql_affected_rows更有最后一个奇怪之处,他发生在从数据库中删除数据时。假如使用WHERE子句,则 mysql_affected_rows将按预期返回删除行数。但是,假如没有WHERE子句,则删除任何行,报告受影响的行数却为0。这是因为由于效率原因优化删除整个表。这种行为不受CLIENT_FOUND_ROWS选项标志的影响。

返回数据的语句

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

MySQL 还支持返回结果的SHOW、DESCRIBE和EXPLAIN SQL语句,但是这里不考虑他们。按惯例,手册中包含这些语句的说明。

您将会从PostgreSQL章记起,能够从PQexec中的SQL SELECT 语句检索数据,这里马上获取任何数据,或使用游标从数据库中逐行检索数据,以便搞定大数据。

由于完全相同的原因,MySQL的检索方法几乎完全相同,虽然他实际上不用游标的形式描述逐行检索。但是,他提供了缩小这两种方法间差异的API,假如需要,他通常使两种方法的互换更加容易。

通常,从MySQL数据库中检索数据有4个阶段:

发出查询

检索数据

处理数据

执行所需的任何整理

象以前相同,我们使用mysql_query发出查询。数据检索是使用mysql_store_result或mysql_use_result完成的,这取决于想如何检索数据,随后使用mysql_fetch_row调用序列来处理数据。最后,必须调用mysql_free_result以允许 MySQL执行任何所需的整理。

全部立即数据检索的函数

能够从SELECT语句(或其他返回数据的语句)中检索完任何数据,在单一调用中,使用mysql_store_result:



MYSQL_RES *mysql_store_result(MYSQL *connection);



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

使用等价的PostgreSQL时,应该知道返回NULL意味着已发生了错误,并且这和未检索到数据的情况不同。即使,返回值不是NULL,也不意味着当前有数据要处理。

假如未返回NULL,则能够调用mysql_num_rows并且检索实际返回的行数,他当然可能是0。



my_ulonglong mysql_num_rows(MYSQL_RES *result);



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

这种mysql_store_result和mysql_num_rows的组合是检索数据的一种简便并且直接的方法。一旦 mysql_store_result成功返回,则任何查询数据都已存储在客户机上并且我们知道能够从结果结构中检索他,而不用担心会发生数据库或网络错误,因为对于程式任何数据都是本地的。还能够立即发现返回的行数,他能够使编码更简便。如前所述,他将任何结果立即地发送回客户机。对于大结果集,他可能耗费大量的服务器、网络和客户机资源。由于这些原因,使用更大的数据集时,最好仅检索需要的数据。不久,我们将讨论如何使用 mysql_use_result函数来完成该操作。

一旦检索了数据,则能够使用mysql_fetch_row来检索他,并且使用mysql_data_seek、mysql_row_seek、mysql_row_tell操作结果集。在开始检索数据阶段之前,让我们先讨论一下这些函数。



MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);



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



void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset);



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



MYSQL_ROW_OFFEST mysql_row_tell(MYSQL_RES *result);



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



MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset);



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

有时,这一对函数对于在结果集中的已知点之间跳转很有用。请注意,不要将row tell和row seek使用的偏移值和data_seek使用的行号混淆。这些是不可交换的,结果将是您所希望看到的。



void mysql_free_result(MYSQL_RES *result);



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

检索数据

现在开始编写从数据库中检索数据的第一个程式。我们将选择任何年龄大于5的行的内容。不幸的是我们还不知道如何处理这个数据,所以我们能做的只有循环检索他。这便是 select1.c:

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!