MySQL的C语言API接口

 更新时间:2020年4月25日 17:37  点击:1723

1、首先当然是连接数据库,函数原型如下:

MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned long clientflag);

第一个参数 MYSQL是 C api中一个非常重要的变量,里面内存非常丰富,有port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。mysql_real_connect函数中各参数,基本都是顾名思意。

2、连接数据库成功之后就可以执行sql语句了使用mysql_query
int STDCALL mysql_query(MYSQL *mysql, const char *q);

第一个参数上面已经介绍过,第二个参数为要执行的sql语句。

这个函数总体就两步:

(1)发送sql语句,其实就一个socket发送sql 语句,加上mysql固定的协议头。懒的去看源码了,抓了下包,如下:
0000 19 00 00 00 0373 65 6c 65 63 74 20 61 70 70 5f .....select app_
0010 6e 61 6d 65 20 66 72 6f 6d 20 61 70 70 name from app
红色部分是协议,前面两位其实就是包的长度。具体协议没研究过。

(2)然后就是接受结果,这里将会调用MYSQL变量中的st_mysql_methods中的read_query_result函数指针

3、获取结果

sql执行完以后,如果是查询语句,我们当然还要读取数据,如果update,insert等语句,那么就看下操作成功与否即可。我们来看看如何获取查询结果: 如果mysql_query返回成功,那么我们就通过mysql_store_result这个函数来读取结果。原型如下:

MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);

该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。 执行完mysql_store_result以后,其实数据都已经在MYSQL_RES 变量中了,下面的api基本就是读取MYSQL_RES 中的数据。例如mysql_fetch_row这个函数,就是读去查询结果的一行。函数原型如下

MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);

它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **.就当成一个二维数组来用吧。还有很多api,不再一一介绍,大部分信息都在MYSQL_RES MYSQL这两个结构体中。具体可以参考mysql官方网站: http://dev.mysql.com/doc/refman/5.1/en/c.html 突然发现官方网站资料好全面,貌似比任何书都要好。

下面来个例子:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<mysql/mysql.h>
#define MAX_COLUMN_LEN  32
int main(int argc , char *argv[])
{
  MYSQL my_connection;
  MYSQL_RES *result;
  MYSQL_ROW sql_row;
  MYSQL_FIELD *fd;
  char column[MAX_COLUMN_LEN][MAX_COLUMN_LEN];
  int res;
  mysql_init(&my_connection);
  if(mysql_real_connect(&my_connection,"127.0.0.1","用户","密码","数据名称",3306,NULL,0))
  {
    perror("connect");
    res=mysql_query(&my_connection,"select * from app");//查询
    if(!res)
    {
      result=mysql_store_result(&my_connection);//保存查询到的数据到result
      if(result)
      {
        int i,j;
        printf("the result number is %lu\n ",(unsigned long)mysql_num_rows(result));
        for(i=0;fd=mysql_fetch_field(result);i++)//获取列名
        {
          bzero(column[i],sizeof(column[i]));
          strcpy(column[i],fd->name);
        }
        j=mysql_num_fields(result);
        for(i=0;i<j;i++)
        {
          printf("%s\t",column[i]);
        }
        printf("\n");
        while(sql_row=mysql_fetch_row(result))//获取具体的数据
        {
          for(i=0;i<j;i++)
          {
            printf("%s\t",sql_row[i]);
          }
          printf("\n");
        }
        
      }
    }
    else
    {
      perror("select");
    }
  }
  else
  {
    perror("connect:error");
  }
  mysql_free_result(MYSQL_RES *result);//释放结果资源
  mysql_close(&my_connection);//断开连接

}

上面这个例子就是从一个表中查数据,然后输出。 如果要insert或者update,只需要修改具体的sql既可。具体的操作都是通过mysql_query这个函数来搞定。 现在来讲编译的方法吧,这里我们需要.h以及.so库。我们可以在 http://dev.mysql.com/downloads/connector/c/6.0.html 下载Connector/C。简单的方法就是: 把里面include的东西拷贝到/usr/include/mysql/下面去,这样编译的时候就不需要加-I了,然后把lib下面的东西拷贝的/usr/lib/下去。

gcc具体的编译方法:gcc ***.c -o *** -lmysqlclient

[!--infotagslink--]

相关文章

  • C语言实现放烟花的程序

    这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
  • C语言中的字符(char)详细讲解

    本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
  • MySQL性能监控软件Nagios的安装及配置教程

    这篇文章主要介绍了MySQL性能监控软件Nagios的安装及配置教程,这里以CentOS操作系统为环境进行演示,需要的朋友可以参考下...2015-12-14
  • 详解如何将c语言文件打包成exe可执行程序

    这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
  • 详解Mysql中的JSON系列操作函数

    新版 Mysql 中加入了对 JSON Document 的支持,可以创建 JSON 类型的字段,并有一套函数支持对JSON的查询、修改等操作,下面就实际体验一下...2016-08-23
  • 深入研究mysql中的varchar和limit(容易被忽略的知识)

    为什么标题要起这个名字呢?commen sence指的是那些大家都应该知道的事情,但往往大家又会会略这些东西,或者对这些东西一知半解,今天我总结下自己在mysql中遇到的一些commen sense类型的问题。 ...2015-03-15
  • MySQL 字符串拆分操作(含分隔符的字符串截取)

    这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
  • mysql的3种分表方案

    一、先说一下为什么要分表:当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。根据个人经验,mysql执行一个sql的过程如下:1...2014-05-31
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • C语言中计算正弦的相关函数总结

    这篇文章主要介绍了C语言中计算正弦的相关函数总结,包括正弦和双曲线正弦以及反正弦的函数,需要的朋友可以参考下...2020-04-25
  • 详解C语言中的rename()函数和remove()函数的使用方法

    这篇文章主要介绍了详解C语言中的rename()函数和remove()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
  • Windows服务器MySQL中文乱码的解决方法

    我们自己鼓捣mysql时,总免不了会遇到这个问题:插入中文字符出现乱码,虽然这是运维先给配好的环境,但是在自己机子上玩的时候咧,总得知道个一二吧,不然以后如何优雅的吹牛B。...2015-03-15
  • Centos5.5中安装Mysql5.5过程分享

    这几天在centos下装mysql,这里记录一下安装的过程,方便以后查阅Mysql5.5.37安装需要cmake,5.6版本开始都需要cmake来编译,5.5以后的版本应该也要装这个。安装cmake复制代码 代码如下: [root@local ~]# wget http://www.cm...2015-03-15
  • 用VirtualBox构建MySQL测试环境

    宿主机使用网线的时候,客户机在Bridged Adapter模式下,使用Atheros AR8131 PCI-E Gigabit Ethernet Controller上网没问题。 宿主机使用无线的时候,客户机在Bridged Adapter模式下,使用可选项里唯一一个WIFI选项,Microsoft Virtual Wifi Miniport Adapter也无法上网,故弃之。...2013-09-19
  • C语言中求和、计算平均值、方差和标准差的实例

    这篇文章主要介绍了C语言中求和、计算平均值、方差和标准差的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-10
  • 忘记MYSQL密码的6种常用解决方法总结

    首先要声明一点,大部分情况下,修改MySQL密码是需要有mysql里的root权限的...2013-09-11
  • MySQL数据库备份还原方法

    MySQL命令行导出数据库: 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:/Program Files/MySQL/MySQL Server 4.1/bin (或者直接将windows的环境变量path中添加该目录) ...2013-09-26
  • C语言的基本语法详解

    本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下,希望能够给你带来帮助...2021-09-18
  • Mysql命令大全(详细篇)

    一、连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码1、连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录mysql/bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密...2015-11-08
  • Navicat for MySQL 11注册码\激活码汇总

    Navicat for MySQL注册码用来激活 Navicat for MySQL 软件,只要拥有 Navicat 注册码就能激活相应的 Navicat 产品。这篇文章主要介绍了Navicat for MySQL 11注册码\激活码汇总,需要的朋友可以参考下...2020-11-23