linux c 开发 mysql程序

Mysql c Api 开发笔记

第一个例子

用来测试mysql开发的环境是否搭建完成,测试的方式是调用一个Mysql的函数。

version.c文件

#include <stdio.h>

#include <mysql.h>

int main(int argc, const char *argv[])

{

    printf("Mysql client version:%s\n",mysql_get_client_info());

    return 0;

}

编译输出的结果:

gcc -I /usr/local/mysql/include/ -L /usr/local/mysql/lib/ -lmysqlclient version.c

输出结果:

Mysql client version:5.6.24

创建一个数据库

以下代码的作用是连接mysql数据库然后创建一个新的数据库用于接下来的测试

#include <mysql.h>

#include <stdio.h>

#include <stdlib.h>

int main(int argc, const char *argv[])

{

    MYSQL *conn;

    conn=mysql_init(NULL);

    if(conn==NULL)

    {

        printf("错误:%u:%s\n",mysql_errno(conn),mysql_error(conn));

        exit(1);

    }

    if(mysql_real_connect(conn,"192.168.10.212","admin","admin",NULL,0,NULL,0)==NULL)

    {

        printf("错误:%u:%s\n",mysql_errno(conn),mysql_error(conn));

        exit(1);

    }

    if(mysql_query(conn,"create database testdb")){

        printf("错误:%u:%s\n",mysql_errno(conn),mysql_error(conn));

    }

    mysql_close(conn);

    return 0;

}

我们通过命令方式来登录数据库发现testdb已经创建完成,说明程序已经正确执行。

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| agc                |

| mysql              |

| performance_schema |

| test               |

| testdb             |

+--------------------+

6 rows in set (0.00 sec)

我们将以上的功能分解成以下几个步骤:

1、初始化一个connection结构句柄

2、创建连接

3、调用query函数来执行sql语句

4、关闭连接

MYSQL *conn;

我们声明一个mysql的结构体指针,这个结构体是一个连接的句柄

conn=mysql_init(NULL);

这个mysql_init()函数获取一个连接的句柄

if(conn==NULL)

    {

        printf("错误:%u:%s\n",mysql_errno(conn),mysql_error(conn));

        exit(1);

    }

我们检查返回值,如果mysql_init()函数调用失败,我们将错误信息和代码打印出来

   if(mysql_real_connect(conn,"192.168.10.212","admin","admin",NULL,0,NULL,0)==NULL)

    {

        printf("错误:%u:%s\n",mysql_errno(conn),mysql_error(conn));

        exit(1);

    }

mysql_real_connect()函数的作用是建立一个数据库连接,函数传递的形参的功能分别为:连接句柄,主机名,端口号,uxinsocket和结构客户端标识

if(mysql_query(conn,"create database testdb")){

printf("错误:%u:%s\n",mysql_errno(conn),mysql_error(conn));

}

有关mysql_query()的作用是执行一个SQL语句,上面的是执行一个数据库创建的sql语句

mysql_close(conn);

最后我们将之前创建的数据库连接关闭

创建和填充一张表

下面的代码的作用是创建一张表并且向这张表内插入一些数据

#include <stdio.h>

#include <mysql.h>

int main(int argc, char const* argv[])

{

    MYSQL *conn;

    conn=mysql_init(NULL);

    mysql_real_connect(conn,"192.168.10.212","admin","admin","testdb",0,NULL,0);

    mysql_query(conn,"create table writers(name varchar(25))");

    mysql_query(conn, "INSERT INTO writers VALUES(‘Leo Tolstoy‘)");

    mysql_query(conn, "INSERT INTO writers VALUES(‘Jack London‘)");

    mysql_query(conn, "INSERT INTO writers VALUES(‘Honore de Balzac‘)");

    mysql_query(conn, "INSERT INTO writers VALUES(‘Lion Feuchtwanger‘)");

    mysql_query(conn, "INSERT INTO writers VALUES(‘Emile Zola‘)");

    mysql_close(conn);

    return 0;

}

我们不需要调用任何新的MySQL函数,只需要通过mysql_query()函数并可以进行表创建和插入数据的操作。

mysql_real_connect(conn,”192.168.10.212","admin","admin","testdb",0,NULL,0);

我们连接数据库并且指定一个默认的数据库名

mysql_query(conn,"create table writers(name varchar(25))”);

我们操作一张名为writers的表,这个表有一个varchar字段。

mysql_query(conn, "INSERT INTO writers VALUES(‘Leo Tolstoy’)");

向表writers插入一条数据,插入的内容是Leo Tolstoy

我们进入数据库查询表是否创建

mysql> show tables;

+------------------+

| Tables_in_testdb |

+------------------+

| writers          |

+------------------+

1 row in set (0.00 sec)

查看数据插入是否成功

mysql> select * from writers;

+-------------------+

| name              |

+-------------------+

| Leo Tolstoy       |

| Jack London       |

| Honore de Balzac  |

| Lion Feuchtwanger |

| Emile Zola        |

+-------------------+

5 rows in set (0.00 sec)

检索数据库数据

这个例子的作用是遍历一张表内的所有的数据并且将其输出出来。

步骤:

创建一个连接

执行查询

获取数据返回数据集

取出所有的行数据

释放返回数据集

#include <stdio.h>

#include <mysql.h>

int main(int argc, char **argv)

{

    MYSQL *conn;

    MYSQL_RES *result;

    MYSQL_ROW row;

    int num_fields;

    int i;

    conn = mysql_init(NULL);

    mysql_real_connect(conn, "192.168.10.212", "admin", "admin", "testdb", 0, NULL, 0);

    mysql_query(conn, "SELECT * FROM writers");

    result = mysql_store_result(conn);

    num_fields = mysql_num_fields(result);

    while ((row = mysql_fetch_row(result)))

    {

        for(i = 0; i < num_fields; i++)

        {

            printf("%s ", row[i] ? row[i] : "NULL");

        }

        printf("\n");

    }

    mysql_free_result(result);

    mysql_close(conn);

}

appledeMacBook-Pro:数据库 apple$ ./a.out

Leo Tolstoy

Jack London

Honore de Balzac

Lion Feuchtwanger

Emile Zola

mysql_query(conn, "SELECT * FROM writers");

上面的代表是从writers表中输出所有名称

result = mysql_store_result(conn);

获取返回的字段总数

num_fields = mysql_num_fields(result);

获取行总数

while ((row = mysql_fetch_row(result)))

{

for(i = 0; i < num_fields; i++)

{

printf("%s ", row[i] ? row[i] : "NULL");

}

printf("\n");

}

每次取一行的数据并将其所有的数据输出到屏幕当中。

mysql_free_result(result);

释放资源

行标题

下面的例子的作用是查询数据的同时将表的标题打印出来

将进行这个操作之前我们需要创建一张新的表并且插入数据

mysql> create table friends (id int not null primary key auto_increment,

->                                name varchar(20), age int);

Query OK, 0 rows affected (0.01 sec)

mysql> insert into friends(name, age) values(‘Tom‘, 25);

Query OK, 1 row affected (0.00 sec)

mysql> insert into friends(name, age) values(‘Elisabeth‘, 32);

Query OK, 1 row affected (0.07 sec)

mysql> insert into friends(name, age) values(‘Jane‘, 22);

Query OK, 1 row affected (0.00 sec)

mysql> insert into friends(name, age) values(‘Luke‘, 28);

Query OK, 1 row affected (0.00 sec)

#include <stdio.h>

#include <mysql.h>

int main(int argc, char **argv)

{

  MYSQL *conn;

  MYSQL_RES *result;

  MYSQL_ROW row;

  MYSQL_FIELD *field;

  int num_fields;

  int i;

  conn = mysql_init(NULL);

  mysql_real_connect(conn, "192.168.10.212", "admin", "admin", "testdb", 0, NULL, 0);

  mysql_query(conn, "SELECT * FROM friends");

  result = mysql_store_result(conn);

  num_fields = mysql_num_fields(result);

  while ((row = mysql_fetch_row(result)))

  {

      for(i = 0; i < num_fields; i++)

      {

          if (i == 0) {

            while((field=mysql_fetch_field(result))) {

                printf("%s ", field->name);

             }

          printf("\n");

          }

          printf("%s  ", row[i] ? row[i] : "NULL");

      }

  }

  printf("\n");

  mysql_free_result(result);

  mysql_close(conn);

}

这个例子跟前面的一样只是添加了一个输出表标题的功能

while((field=mysql_fetch_field(result))) {

printf("%s ", field->name);

}

调用mysql_fetch_field()的作用是返回一个MYSQL_FIELD的结构体,我们可以通过这个结构体获取行标题名。

appledeMacBook-Pro:数据库 apple$ ./a.out

id name age

1  Tom  25

2  Elisabeth  32

3  Jane  22

4  Luke  28

插入图片到MySQL database

我们需要创建一张保存图片的表

create table images(id int not null primary key, data mediumblob);

#include <stdio.h>

#include <mysql.h>

int main(int argc, char **argv)

{

  MYSQL *conn;

  int len, size;

  char data[1000*1024];

  char chunk[2*1000*1024+1];

  char query[1024*5000];

  FILE *fp;

  conn = mysql_init(NULL);

  mysql_real_connect(conn, "192.168.10.212", "admin", "admin", "testdb", 0, NULL, 0);

  fp = fopen("image.png", "rb");

  size = fread(data, 1, 1024*1000, fp);

  mysql_real_escape_string(conn, chunk, data, size);

  char *stat = "INSERT INTO images(id, data) VALUES(‘1‘, ‘%s‘)";

  len = snprintf(query, sizeof(stat)+sizeof(chunk) , stat, chunk);

  mysql_real_query(conn, query, len);

  fclose(fp);

  mysql_close(conn);

}

上面的例子我们向数据库插入一张图片到images表中,这个图片可以最大为1M

fp = fopen("image.png", "rb");

size = fread(data, 1, 1024*1000, fp);

我们打开一张图片并且将其读入到一个数据数组当中

mysql_real_escape_string(conn, chunk, data, size);

我们将读入的二进制数据进行重新编码使其能够正确的插入到数据当中,避免插入特殊的字符而产生的错误。

char *stat = "INSERT INTO images(id, data) VALUES(‘1‘, ‘%s‘)";

len = snprintf(query, sizeof(stat)+sizeof(chunk) , stat, chunk);

这两行的作用是准备查询所需要的语句

mysql_real_query(conn, query, len);

执行查询

从数据库当中获取图片

在之前我们提供了一个例子是将图片插入到数据库当中,现在我们取出刚才所插入的图片

#include <stdio.h>

#include <mysql.h>

int main(int argc, char **argv)

{

  MYSQL *conn;

  MYSQL_RES *result;

  MYSQL_ROW row;

  unsigned long *lengths;

  FILE *fp;

  conn = mysql_init(NULL);

  mysql_real_connect(conn, "192.168.10.212", "admin", "admin", "testdb", 0, NULL, 0);

  fp = fopen("image2.png", "wb");

  mysql_query(conn, "SELECT data FROM images WHERE id=1");

  result = mysql_store_result(conn);

  row = mysql_fetch_row(result);

  lengths = mysql_fetch_lengths(result);

  fwrite(row[0], lengths[0], 1, fp);

  mysql_free_result(result);

  fclose(fp);

  mysql_close(conn);

}

这个例子是从数据库取出我们刚才所插入的图片并且保存成一张图片文件

p = fopen("image2.png", "wb");

打开一个文件用于写入

mysql_query(conn, "SELECT data FROM images WHERE id=1");

查询id=1的图片

row = mysql_fetch_row(result):

取出行数据

lengths = mysql_fetch_lengths(result);

获取图片的存储容量

fwrite(row[0], lengths[0], 1, fp);

调用fwrite来写入图片

时间: 2024-09-28 07:10:54

linux c 开发 mysql程序的相关文章

[linux]codeblocks开发mysql配置

1.在安装好mysql后,可以应该安装必要的库文件 $sudo apt-get install libmysqlclient-dev 2.将codeblocks与mysql的库文件连接起来 在codeblocks中的setting->complier->complier settint->otheroption中添加如下内容: `mysql_config --cflags`(注意两边是波浪线)-std=c11(c99标准) 在link setting->other link opt

linux c开发: 在程序退出时进行处理

有时候,希望程序退出时能进行一些处理,比如保存状态,释放一些资源.c语言开发的linux程序,有可能正常退出(exit),有可能异常crash,而异常crash可能是响应了某信号的默认处理.这里总结一下这些情况,如何获取一个统一的退出处理的点,说白了就是写一个回调函数,让他在程序正常或异常退出时调用. 先看正常退出,即调用exit或者main函数return亦或最后一个线程正常退出时,如何捕获退出事件. 使用atexit函数.头文件:#include<stdlib.h>, 函数原型:void

linux下apache+mysql+php开发环境纯源代码编译搭建

linux下apache+mysql+php开发环境纯源代码编译搭建 记录一下我在fedora core 1下通过源代码编译出来的apache+mysql+php开发环境的全部过程 通常安装一台服务器当然使用rpm是最方便的,不需要考虑太多配置的问题,就可以轻松获得需要的环境了.不过rpm包互相关联的问题也不是这么容易解决. apache,mysql,php这三个应用从源代码编译安装还是比较简单的,配置参数不算复杂,而且没有太多的依赖关系,从源码编译出来的系统也比较稳定一些,方便未来打补丁和升级

linux 下安装 mysql 并配置 python 开发环境

1.安装 mysql ,安装过程中将提示设置 root 用户的密码,默认可以设置为 rootadmin . $ sudo apt-get install mysql-server 2.安装 mysql 开发工具(不安装时,安装 MySQL-python 提示错误 "mysql_config not found"). $ sudo apt-get install libmysqld-dev 3.安装 python 的 mysql 库 MySQL-python (首先安装 python-d

搞定linux上MySQL编程(六):C语言编写MySQL程序(结)

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 在实际应用中,我们不可能在命令行登录进数据库进行数据的查询.插入等操作,用户一般是使用一个界面良好的应用程序软件来对数据进行管理.为了方便应用程序的开发,MySQL提供了多种编程语言(C.perl.php等)的编程接口,供开发者使用. 对于C语言来说,MySQL提供了C语言客户机库,它允许从任何C程序的内部访问MySQL数据库,客户机实现API,API定义了客户机如何建立和执

[email&#160;protected]_Course_LabVIEW+MySQL程序开发

LabVIEW+MySQL程序开发 大数据时代,LabVIEW程序开发怎么能少了数据库这一强大的工具,然而大多数的LabVIEW工程师对于数据库的概念了解比较少,所以本课程重点介绍如何利用MySQL,让自己的程序上升一个档次. 首先,如果想要设计一个复杂的大型程序,必不可少的即数据库的支持,纵观众多的数据库,MySQL以其免费和操作简单,支持互联网和局域网访问等众多特性,成为了数据库设计的首选.本节主要介绍数据库的安装问题和数据库操作. 第一步:下载MySQL环境,百度搜索MySQL,在官网中我

如何选择合适的Linux系统进行桌面程序开发?

32 or 64 ? 众所周知,64位的Windows系统可以近乎完美地运行32位的应用程序,微软出于商业考虑做了这样一个兼容层.而Linux系统则划分的很清楚,默认情况下64位的Linux系统无法运行32位的应用程序.但是Linux又是一个高度可定制的系统,通过安装一些库或者其它的配置方法可以让64位的系统运行32位的应用程序. 现实情况是针对于Linux系统开发的应用程序大都提供了两个版本,32位的和64位的. 可以选择针对32位和64位系统分别开发程序(两份代码),也可以选择开发一份代码,

如何在64位版本Linux上开发运行32位应用程序

最近换了Linux系统,由i686换成了x86-64,导致在进行开发的时候出用不了原来SDK中32位的开发工具.于是,博主找到如下文章,博主亲测实用: 如何在64位版本Linux上开发运行32位应用程序 内容如下: 很多程序员(特别是别的公司的)跟我抱怨说他们32位软件无法在我们的64位Linux系统上正常运行,而在他们32位机上正常,其实这个很好解决,一般 是64位系统安装后没有默认安装glibc的32位版本,通过简单的执行以下命令即可实现在64位Linux系统上开发运行32位应用程序,而不用

云开发与WePY,快速实现Linux命令查询小程序

大家好,今天我来为大家分享一下, Linux 命令查询小程序中的 WePY 云开发实践. Why WePY首先,先分享一下为什么要选择 WePY ? 在项目开始进行选型的时候,我可选的底层框架有 WePy.MPVue.Taro.MinUI,这些框架都是工程化做得很好的框架,可以帮助小程序项目长期进行维护.其中,Taro 因为采用的是我所不熟悉的 React ,所以从一开始就被排除.MPVue 我看了以后,它更多是给 Web 开发者提供小程序转化工具,而不是给小程序开发者提供类 Vue 工具,所以