一、环境与条件

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

MYSQL C API 记录的更多相关文章

  1. mysql C API的使用

    <MySQL++简介>介绍了如何使用C++来访问mysql,本文记录下使用C API访问mysql,mysql++就是对本文介绍的C-API的封装. 常用函数(名字就能告诉我们用法): M ...

  2. PHP数据库操作:从MySQL原生API到PDO

    本文将举详细例子向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对象.PDO操作MySQL数据库的. 为了后面的测试,先建立数据库表test.包含表名user,s ...

  3. c++使用mysql的api连接相关问题

    记录一下自己使用中的相关问题,方便有相同问题的同学解决. 关于在VS中的各种配置.看这里.只是须要注意一下,我如今用的mysql版本号是5.6的,已经没有[MySQL Server \lib\opt] ...

  4. MySQL原生API、MySQLi面向过程、MySQLi面向对象、PDO操作MySQL

    [转载]http://www.cnblogs.com/52fhy/p/5352304.html 本文将举详细例子向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对 ...

  5. mysql C API 字符串玩转备份调优

  6. MySQL高效获取记录总数

    通常mysql获取查询记录总数我们使用如下语句: SELECT COUNT(*) FROM users WHERE k='avs';  或:SELECT id FROM goods WHERE k=' ...

  7. The MySQL C API 编程实例

    在网上找了一些MYSQL C API编程的文章,看了后认为还是写的不够充分,依据自己经验写了这篇<The MySQL C API 编程实例>,希望对须要调用到MYSQL的C的API的朋友有 ...

  8. CentOS7.4安装MySQL踩坑记录

    CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...

  9. MySQL C API概述

    以下列表总结了C API中可用的功能.有关更多详细信息,请参见 第27.8.7节“C API函数描述”中的说明. my_init():在线程安全程序中初始化全局变量和线程处理程序 mysql_affe ...

随机推荐

  1. It's only too late if you decide it is. Get busy living, or get busy dying(转)

    我们的身边是不是有这样的一群人,他们心肠不坏,容易感伤,但吐槽似乎是常有的事情,看着时下电视电影,说起哪些哪些自己的泪点.一般都是吃货,别人失眠的时候,TA可能在回忆自己刚做了什么梦.我不是要去评论这 ...

  2. 【iOS】彩虹渐变色 的 Swift 实现

    首先很感谢大家的支持与关注.<Web Color 的 Swfit 实现>一文一经公布.訪问量迅速攀升,让本人受宠若惊. 为表达感激之情,今天早上把彩虹渐变也顺手实现了. 最新代码& ...

  3. Android进程间通信(IPC)机制Binder简介和学习计划

    在Android系统,每个应用程序是由多个Activity和Service部件,这些Activity和Service有可能在相同的处理被执行,此外,还可以在不同的过程中进行. 然后.不是在同一个过程A ...

  4. 【夸QT十一】外来物品:通用脚本帮助Web运行基础Linux命令

    需求分析: 需要注意的是在这里第一次,这个人是不是QT系列文章,它是关于Web的,之所以写这篇文章.这是因为碍着Web相关开发时间,而且往往涉及linux与底层指令处理.例如,创建一个文件夹,删除一个 ...

  5. easyui动力头 &amp;&amp; 动态加入tabs

    今天,在实现了业务时的,我们需要根据后台操作,以产生多个数据tab页,而且每一个tab页表格根据需要动态生成的标题数据. 返回后台数据格例如,下面的公式: 实现方法例如以下: //$("#c ...

  6. SICP 锻炼 (2.15)解决摘要:深入思考间隔误差

    SICP 2.15 是接着 题目 2.14 的, 题目 2.14中提到了Alyssa设计的区间计算模块在并联电阻计算时会出现故障,这个问题是Lem发现的. 接着,一个叫Eva的人也发现了这个问题.同一 ...

  7. 桥模式设计模式进入Bridge

    Abstraction:抽象部分的父类,定义须要实现的接口. 维护对实现部分的引用,从而把实现桥接到Implementor中去 Implementor:实现部分的接口 RefinedAbstracti ...

  8. [Servlet3.0新功能]注释替代配置文件

    作者信息 作者名称:金云龙 个人网站:http://www.longestory.com 个人公众帐号:搜索"longestory"或"龙哥有话说" 须要注意的 ...

  9. php学习笔记--高级教程--读取文件、创建文件、写入文件

    打开文件:fopen:fopen(filename,mode);//fopen("test.txt","r"): 打开模式:r  仅仅读方式打开,将文件指针指向 ...

  10. Handler消息源代码分析

    public static final Looper myLooper() { return (Looper)sThreadLocal.get(); } 首先到Handler运行过程的总结: 1. L ...