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

  • 相关阅读:
    LeetCode 121. Best Time to Buy and Sell Stock
    LeetCode 221. Maximal Square
    LeetCode 152. Maximum Product Subarray
    LeetCode 53. Maximum Subarray
    LeetCode 91. Decode Ways
    LeetCode 64. Minimum Path Sum
    LeetCode 264. Ugly Number II
    LeetCode 263. Ugly Number
    LeetCode 50. Pow(x, n)
    LeetCode 279. Perfect Squares
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4052570.html
Copyright © 2011-2022 走看看