文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>mysql c api 使用...

mysql c api 使用...

时间:2010-08-18  来源:jsufcz

请多参考阅读 MYSQL C API手册 网址:http://dev.mysql.com/doc/refman/5.1/zh/apis.html#c-thread-functions

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

一、环境与条件

        MySQL AB 提供了C API,可以提供低等级界面,负责完成涉及SQL服务器交互的大多数常规任务:数据库连接 、查询、结果集处理和错误处置。C API通过两个组件实现:

        头文件:mysql.h,包含结构和功能说明。

        Mysql库:libmysqlclient(Unix) 或 mysqlclient.lib(Windows),包括C的实际功能。

        另外,在Windows下构建客户机,需要特别注意一些额外情况。见 http://www.mysql.com/doc/en/windows_client_compiling.html。如果计划在Windows下编译客户机,还需要第三个组件:

        头文件:my_global.h,提供Windows需要的额外定义。

       安装后,mysql.h和mysqlclient.lib(或libmysqlclient)分别可以在MySQL的安装目录下找到。

二、MySQL API 使用步骤

       1.初始化MYSQL结构:mysql_init(&mysql); // mysql 类型为 MYSQL.

       2.建立到服务器连接:mysql_real_connect(&mysql, "host", "user", "password", "db1", 0, NULL, 0); //采用默认值的三个参数分别为:连接MySQL服务器时使用的端口,连接MySQL服务器时使用的套接字,控制客户机行为使用的一个或多个可选标志。详情可参阅MySQL手册。

                如果连接成功,将返回一个句柄,连接失败,将返回假。参考 http://www.mysql.com/documentation

        3.选择数据库:mysql_select_db(&mysql, "db_name");

        4.查询实施:mysql_query(&mysql, query_string);

        5.对Select查询返回的结果集处理:

                MYSQL_RES * result = mysql_store_result(&mysql); //将查询的结果保持到变量result。如果mysql_query()执行出错,用mysql_store_query()函数取结果集将返回NULL给result。如果客户机内存不大,可以每次检索一行记录:mysql_use_result()。

                int numRows = mysql_num_rows(result); //检验结果集行数。

                int numFields = mysql_num_fields(result); //检验结果集列数。

                MYSQL_ROW row  =  mysql_fetch_row(result); //从结果集读取一行记录。

                MYSQL_FIELD * field = mysql_fetch_field(result); //返回字段属性详细信息,如:字段名,类型,长度...

                MYSQL_FIELD* fields=mysql_fetch_fields(result); //返回MYSQL_FIELD结构的数组,每个字段针对一个结果集合。

                mysql_free_result(result); //使用完后,要释放结果集变量空间。

        6.INSERT,UPDATE、DELETE等操作的结果处理:

               mysql_affected_rows(&mysql); //返回受影响的记录数

        7.涉及结果集处理的辅助函数:

               MYSQL_ROW_OFFSET STDCALL mysql_row_seek(MYSQL_RES *result,
                       MYSQL_ROW_OFFSET offset); //跳至该具体行


               MYSQL_FIELD_OFFSET STDCALL mysql_field_seek(MYSQL_RES *result,
                       MYSQL_FIELD_OFFSET offset); //跳至该行具体列

               MYSQL_ROW_OFFSET STDCALL mysql_row_tell(MYSQL_RES *res); //返回字段列表中字段游标当前位置。
               MYSQL_FIELD_OFFSET STDCALL mysql_field_tell(MYSQL_RES *res); //返回结果集中行游标当前位置。

               unsigned long * STDCALL mysql_fetch_lengths(MYSQL_RES *result); //当前行的字段值长度

               my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql); //返回产生ATUO_INCREMENT字段的最后ID。

        8.错误处置:

              unsigned int STDCALL mysql_errno(MYSQL *mysql); //错误号
              const char * STDCALL mysql_error(MYSQL *mysql); //错误信息

        9.关闭连接:

              mysql_close(MYSQL* mysql);

        示例:客户机查询器

#include "stdafx.h"
#include <windows.h>
#include <winsock.h>
#include <iostream>
#include "F:\MySQL5\include\mysql.h"

#pragma comment(lib, "F:\\MySQL5\\lib\\opt\\libmysql.lib")

using namespace std;

int main(int argc, char* argv[])
{
 char query[255];
 int i, j, h;
 MYSQL mysql;
 MYSQL_RES *result;
 MYSQL_ROW row;
 MYSQL_FIELD *field;

 if (argc != 4)
 {
  printf ("Usage: %s <host> <user> <password>\n", argv[0]);
  return -1;
 }

 mysql_init(&mysql);

 if (!(mysql_real_connect(&mysql, argv[1], argv[2], argv[3], NULL, 0, NULL, 0)))
 {
  fprintf(stderr, "Error in connection: %s\n", mysql_error(&mysql));
  return -1;
 }

 while (true)
 {
  printf ("query? ");
  fgets(query, sizeof(query), stdin);
  if (strcmp (query, "exit\n") ==0) break;

  if (mysql_query(&mysql, query) != 0)
  {
   fprintf (stderr, "Error in query: %s\n", mysql_error(&mysql));
  }
  else
  {
   if (result = mysql_store_result(&mysql))
   {
    int numRecords = mysql_num_rows(result);
    int numFields = mysql_num_fields(result);

    for (h = 0; h < numFields; h++)
    {
     field = mysql_fetch_field(result);
     printf ("[%s]", field->name);
     h != (numFields-1) ? printf (", ") : printf("\n");
    }

    for (i = 0; i < numRecords; i++)
    {
     row = mysql_fetch_row(result);
     for (j = 0; j < numFields; j++)
     {
      fprintf (stdout, "%s", row[j]);
      j != (numFields-1) ? printf(", ") : printf("\n");
     }
    }

    fprintf (stdout, "** Query successful, %d rows retrieved **\n", numRecords);
    mysql_free_result(result);
   }
   else
   {
    if (mysql_field_count(&mysql) == 0)
    {
     fprintf (stdout, "** Query successful, %d rows affected **\n", mysql_affected_rows(&mysql));
    }
    else
    {
     fprintf (stderr, "Error in reading result set: %sn\n", mysql_error(&mysql));
    }
   }
  }
 }

 mysql_close(&mysql);
 return 0;
}

环境:VC 6.0, mysql 5.0.45-community-nt

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  添加头文件:#include <mysql.h>
  导入库文件:
  #pragma   comment(lib,"libmysql.lib")  
  #pragma   comment(lib,"mysqlclient.lib")  
  #pragma   comment(lib,"zlib.lib")  
  以下摘自Mysql5.1在线中文手册http://imysql.cn/docs/MySQL_51_zh/mysql_51.html
  与MySQL交互时,应用程序应使用该一般性原则:
  1.通过调用mysql_library_init(),初始化MySQL库。库可以是mysqlclient C客户端库,或mysqld嵌入式服务器库,具体情况取决于应用程序是否与“-libmysqlclient”或“-libmysqld”标志链接。
  2.通过调用mysql_init()初始化连接处理程序,并通过调用mysql_real_connect()连接到服务器。
  3.发出SQL语句并处理其结果。(在下面的讨论中,详细介绍了使用它的方法)。
  4.通过调用mysql_close(),关闭与MySQL服务器的连接。
  5.通过调用mysql_library_end(),结束MySQL库的使用。
  调用mysql_library_init()和mysql_library_end()的目的在于,为MySQL库提供恰当的初始化和结束处理。对于与客户端库链接的应用程序,它们提供了改进的内存管理功能。如果不调用mysql_library_end(),内存块仍将保持分配状态(这不会增加应用程序使用的内存量,但某些内存泄漏检测器将抗议它)。对于与嵌入式服务器链接的应用程序,这些调用会启动并停止服务器。
  mysql_library_init()和mysql_library_end()实际上是#define符号,这类符号使得它们等效于mysql_server_init()和mysql_server_end(),但其名称更清楚地指明,无论应用程序使用的是mysqlclient或mysqld库,启动或结束MySQL库时,应调用它们。对于早期的MySQL版本,可调用mysql_server_init()和mysql_server_end()取而代之。
  如果愿意,可省略对mysql_library_init()的调用,这是因为,必要时,mysql_init()会自动调用它。
  要想连接到服务器,可调用mysql_init()来初始化连接处理程序,然后用该处理程序(以及其他信息,如主机名、用户名和密码)调用mysql_real_connect()。建立连接后,在低于5.0.3版的API中,mysql_real_connect()会将再连接标志(MYSQL结构的一部分)设置为1,或在较新的版本中,将其设置为0。对于该标志,值“1”指明,如果因连接丢失而无法执行语句,放弃之前,会尝试再次连接到服务器。从MySQL 5.0.13开始,可以在mysql_options()上使用MYSQL_OPT_RECONNECT选项,以控制再连接行为。完成连接后,调用mysql_close()中止它。
  当连接处于活动状态时,客户端或许会使用mysql_query()或mysql_real_query()向服务器发出SQL查询。两者的差别在于,mysql_query()预期的查询为指定的、由Null终结的字符串,而mysql_real_query()预期的是计数字符串。如果字符串包含二进制数据(其中可能包含Null字节),就必须使用mysql_real_query()。
  对于每个非SELECT查询(例如INSERT、UPDATE、DELETE),通过调用mysql_affected_rows(),可发现有多少行已被改变(影响)。
  对于SELECT查询,能够检索作为结果集的行。注意,某些语句因其返回行,类似与SELECT。包括SHOW、DESCRIBE和EXPLAIN。应按照对待SELECT语句的方式处理它们。
  客户端处理结果集的方式有两种。一种方式是,通过调用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()的1个优点在于,由于将行全部提取到了客户端上,你不仅能连续访问行,还能使用mysql_data_seek()或mysql_row_seek()在结果集中向前或向后移动,以更改结果集内当前行的位置。通过调用mysql_num_rows(),还能发现有多少行。另一方面,对于大的结果集,mysql_store_result()所需的内存可能会很大,你很可能遇到内存溢出状况。
  mysql_use_result()的1个优点在于,客户端所需的用于结果集的内存较少,原因在于,一次它仅维护一行(由于分配开销较低,mysql_use_result()能更快)。它的缺点在于,你必须快速处理每一行以避免妨碍服务器,你不能随机访问结果集中的行(只能连续访问行),你不知道结果集中有多少行,直至全部检索了它们为止。不仅如此,即使在检索过程中你判定已找到所寻找的信息,也必须检索所有的行。
  通过API,客户端能够恰当地对查询作出响应(仅在必要时检索行),而无需知道查询是否是SELECT查询。可以在每次mysql_query()或mysql_real_query()后,通过调用mysql_store_result()完成该操作。如果结果集调用成功,查询为SELECT,而且能够读取行。如果结果集调用失败,可调用mysql_field_count()来判断结果是否的确是所预期的。如果mysql_field_count()返回0,查询不返回数据(表明它是INSERT、UPDATE、DELETE等),而且不返回行。如果mysql_field_count()是非0值,查询应返回行,但没有返回行。这表明查询是失败了的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()函数访问错误信息的机制。它们能返回关于最近调用的函数的错误代码或错误消息,最近调用的函数可能成功也可能失败,这样,你就能判断错误是在何时出现的,以及错误是什么。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载