zoukankan      html  css  js  c++  java
  • MYSQL C API 记录

    一、环境与条件

            MySQL AB 提供了C API,能够提供低等级界面,负责完毕涉及SQLserver交互的大多数常规任务:数据库连接 、查询、结果集处理和错误处置。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.建立到server连接:mysql_real_connect(&mysql, "host", "user", "password", "db1", 0, NULL, 0); //採用默认值的三个參数分别为:连接MySQLserver时使用的port,连接MySQLserver时使用的套接字,控制客户机行为使用的一个或多个可选标志。详情可參阅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

  • 相关阅读:
    python框架之Django(2)-简单的CRUD
    python框架之Django(1)-第一个Django项目
    实习进度13
    实习进度12
    实习进度11
    实习进度10
    学习进度08
    毕设进度07
    毕设进度06
    毕设进度05
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4052570.html
Copyright © 2011-2022 走看看