会员注册
会员登陆
取回密码
欢迎您回来
实易文章 || 发表文章 || 管理文章

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

分类:: 电脑编程 / 发表时间 :: 2002-08-29 12:34:48
作者 :: 16hot | 人气 ::  |  评论数目 (0) | 发送 | 来源 ::
您将会从 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_fetch_rowmysql_fetch_row

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);


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

mysql_data_seek

void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset);


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

my_sql_row_tell, mysql_row_seek

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 使用的行号混淆。这些是不可交换的,结果将是您所希望看到的。

mysql_free_result
在迫不及待地使用这些新函数之前,我们需要知道的最后一个函数是 mysql_free_result。

void mysql_free_result(MYSQL_RES *result);


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

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

    #include <stdlib.h>
    #include <stdio.h>

    #include "mysql.h"

    MYSQL my_connection;
    MYSQL_RES *res_ptr;
    MYSQL_ROW sqlrow;

    int main(int argc, char *argv[]) {
        int res;

        mysql_init(&my_connection);
        if (mysql_real_connect(&my_connection, "localhost", "rick",
                                                "bar", "rick", 0, NULL, 0)) {
        printf("Connection successn");

        res = mysql_query(&my_connection, "SELECT childno, fname,
                                        age FROM children WHERE age > 5");
        if (res) {
          printf("SELECT error: %sn", mysql_error(&my_connection));
        } else {
          res_ptr = mysql_store_result(&my_connection);
          if (res_ptr) {
          printf("Retrieved %luowsn",(unsignedlong)mysql_num_rows(res_ptr));
            while ((sqlrow = mysql_fetch_row(res_ptr))) {
              printf("Fetched data...n");
            }
          if (mysql_errno(&my_connection)) {
          fprintf(stderr, "Retrive error: sn",mysql_error(&my_connection));
            }
          }
          mysql_free_result(res_ptr);
        }     

        mysql_close(&my_connection);

        } else {
          fprintf(stderr, "Connection failedn");
          if (mysql_errno(&my_connection)) {
              fprintf(stderr, "Connection error %d: %sn",
                    mysql_errno(&my_connection),mysql_error(&my_connection));
          }
        }

        return EXIT_SUCCESS;

[ 返回 ]


■ 相关文章
· 对网站流量分析方法了解吗? (2006-05-19)
· 只需三万八,本田雅阁开回家 (2005-07-09)
· 买车吗?不妨进来看看!-9788 (2005-05-23)
· ★有意买车的顾客不妨进来看一看!!!!!! (2005-05-15)
· 李维语录 (2004-12-06)
· GNU make 指南(转自www.lisoleg.net) (2004-11-17)
· GCC - 一切从这里开始 (2004-11-17)
· gcc最佳编译参数 (2004-11-17)
· 旅行社需要什么样的管理软件(二) (2003-03-19)
· 旅行社需要什么样的管理软件(一) (2003-03-19)
· 编程书写规则 (2003-03-14)
· 用perl访问mysql数据库 (2002-12-25)
· 从程序员升级到工程师 (2002-12-20)
· 将PHP作为Shell脚本语言使用 (2002-11-26)
· PHP输出控制功能在简繁体转换中的应用 (2002-11-26)
· 用asp+实现文件上传 (2002-10-26)
· ASP.NET编程中的十大技巧 (2002-10-26)
· 关于asp.net的配置问题 (2002-10-26)
· 王志东的软件思想 (2002-10-24)
· [转帖] linux上使用ASP (2002-10-18)
· mail() 也发html文件 (2002-09-29)
· JSP的mysql_jdbc驱动程序 (2002-09-29)
· XML 技术的相关资源和教程(转) (2002-08-30)
· Linux C++ 自学笔记 (2002-08-29)
· 在 MySQL 数据库中使用 C 执行 SQL 语句(3) (2002-08-29)
· 在 MySQL 数据库中使用 C 执行 SQL 语句(2) (2002-08-29)
· 在 MySQL 数据库中使用 C 执行 SQL 语句(1) (2002-08-29)
· 基于MySQL的高性能数据库应用开发(转) (2002-08-29)
· 用C语言编写访问MySQL的程序(转) (2002-08-29)
· java在Linux下的web应用 (2002-08-23)

http://www.isyi.com
Copyright © 2002-2005 实易数码. All rights Reserved 
版权声明:实易数码是本Blog托管服务提供商。实易数码不承担任何责任,请与Blog使用者联系解决。
粤ICP备05023051号