Mysql数据库动态库: libmysql.dll  libmysql.lib mysql.h  WinSock2.h

Mysql API数据结构   (mysql.h)

MYSQL:连接数据库前,必须先创建MYSQL变量,此变量在很多Mysql API函数会用到。它包含了一些连接信息等数据。

MYSQL_RES:MYSQL_RES结构体中包含了查询结果集,也就是从数据库中查询到的数据。可以使用mysql_store_result或mysql_use_result函数获得。

MYSQL_ROW:MYSQL ROW的定义如下:typedef char **MYSQL_ROW;可见,它实际上是char **类型,指向一个字符串数组。存储一行中各段字符数组,可以通过mysql_fetch_row函数获得。

MYSQL_FIELD:MYSQL_FIELD中包含了字段名、字段类型和大小等信息。可以重复调用mysql_fetch_field函数获得所有字段的信息。

Mysql C API编程步骤

1、首先我们要包含mysql的头文件,并链接mysql动态库。

#include <WinSock2.h>      // 进行网络编程需要winsock2.h

#include <mysql.h>

#pragma comment(lib, "libmysql.lib")

2、创建MYSQL变量。如:

MYSQL mysql;

3、初始化MYSQL变量。

mysql_init(&mysql);

4、调用mysql_real_connect函数连接Mysql数据库。

mysql_real_connect函数的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--前面定义的MYSQL变量;host--MYSQL服务器的地址;user--登录用户名;passwd--登录密码;db--要连接的数据库;port--MYSQL服务器的TCP服务端口;unix_socket--unix连接方式,为NULL时表示不使用socket或管道机制;clientflag--Mysql运行为ODBC数据库的标记,一般取0。

连接失败时该函数返回0。

5、调用mysql_real_query函数进行数据库查询。mysql_real_query函数的原型如下:

int  STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);

参数说明:mysql--前面定义的MYSQL变量;q--SQL查询语句;length--查询语句的长度。

查询成功则该函数返回0。

6、通过调用mysql_store_result或mysql_use_result函数返回的MYSQL_RES变量获取查询结果数据。

两个函数的原型分别为:

MYSQL_RES *     STDCALL mysql_store_result(MYSQL *mysql);

MYSQL_RES *     STDCALL mysql_use_result(MYSQL *mysql);

这两个函数分别代表了获取查询结果的两种方式。第一种,调用mysql_store_result函数将从Mysql服务器查询的所有数据都存储到客户端,然后读取;第二种,调用mysql_use_result初始化检索,以便于后面一行一行的读取结果集,而它本身并没有从服务器读取任何数据,这种方式较之第一种速度更快且所需内存更少,但它会绑定服务器,阻止其他线程更新任何表,而且必须重复执行mysql_fetch_row读取数据,直至返回NULL,否则未读取的行会在下一次查询时作为结果的一部分返回,故经常我们使用mysql_store_result。

7、调用mysql_fetch_row函数读取结果集数据。

上述两种方式最后都是重复调用mysql_fetch_row函数读取数据。mysql_fetch_row函数的原型如下:

MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);

参数result就是mysql_store_result或mysql_use_result的返回值。

该函数返回MYSQL_ROW型的变量,即字符串数组,假设为row,则row[i]为第i个字段的值。当到结果集尾部时,此函数返回NULL。

8、结果集用完后,调用mysql_free_result函数释放结果集,以防内存泄露。mysql_free_result函数的原型如下:

void  STDCALL mysql_free_result(MYSQL_RES *result);

9、不再查询Mysql数据库时,调用mysql_close函数关闭数据库连接。mysql_close函数的原型为:

void STDCALL mysql_close(MYSQL *sock);

例子:

1. int main()  {

2.     MYSQL mysql;

3.     MYSQL_RES *res;

4.     MYSQL_ROW row;

5.     mysql_init(&mysql);  // 初始化MYSQL变量

6.     // 连接Mysql服务器,本例使用本机作为服务器。访问的数据库名称为"msyql",参数中的user为你的登录用户名,***为登录密码,需要根据你的实际用户进行设置

7.     if (!mysql_real_connect(&mysql, "127.0.0.1", "user", "123", "mysql", 3306, 0, 0))  {

8.         cout << "mysql_real_connect failure!" << endl;

9.         return 0;

10.     }

11.     if (mysql_real_query(&mysql, "select * from user", (unsigned long)strlen("select * from user"))){    // 查询mysql数据库中的user表

12.         cout << "mysql_real_query failure!" << endl;

13.         return 0;

14.     }  // 存储结果集

15.     res = mysql_store_result(&mysql);

16.     if (NULL == res) {

17.         cout << "mysql_store_result failure!" << endl;

18.         return 0;

19.     }

20.     // 重复读取行,并输出第一个字段的值,直到row为NULL

21.     while (row = mysql_fetch_row(res))  {

22.         cout << row[0] << endl;

23.     }

24.     mysql_free_result(res);  // 释放结果集

25.     mysql_close(&mysql);  // 关闭Mysql连接

26.       return 0;  }

10.Char * mysql_get_client_info() 显示mysql客户端版本

MySQL client version: 5.0.38

11.int mysql_num_fields(MYSQL_RES *result) 返回结果子表中域(字段)的个数

12. MYSQL_FIELD * mysql_fetch_field(MYSQL_RES *result) 返回结果子表中的域结构体指针

13.Void mysql_real_escape_string(MYSQL* con, char* savedata, char *data, int size) 在将二进制数据(非文本)保存到数据库之前,需要转义,否则数据库不能正常保存,取出数据时,无需解转移。转义时一个字符转义后2个字符,所以savedata内存必须为data的2倍

14. unsigned long * mysql_fetch_lengths(MYSQL_RES *result) 获取结果中各个字符串的长度,返回为1维数组

一些有用的例子:

#include

#include

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, "localhost", "zetcode", "passwd", "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);

}

The example prints all names from the writers table.

$ ./select

Leo Tolstoy

Jack London

Honore de Balzac

Lion Feuchtwanger

Emile Zola

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

We execute the query, that will retrieve all names from the writers database.

result = mysql_store_result(conn);

We get the result set.

num_fields = mysql_num_fields(result);

We get the number of fields in the table.

while ((row = mysql_fetch_row(result)))

{

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

{

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

}

printf("\n");

}

We fetch the rows and print them to the screen.

mysql_free_result(result);

We free the resources.

Column headers

In the next example, we will retrieve data and show the their column names from the table.

For this, we will create a new table friends.

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

name varchar(20), age int);

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

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

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

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

We insert some data into the table.

#include

#include

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, "localhost", "zetcode", "passwd", "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);

}

The example is similar to the previous one. It just adds column header names to it.

while(field = mysql_fetch_field(result)) {

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

}

The mysql_fetch_field() call returns a MYSQL_FIELD structure. We get the column header names from this structure.

$ ./headers

id name age

1  Tom  25

2  Elisabeth  32

3  Jane  22

4  Luke  28

And this is the output of our program.

Inserting p_w_picpaths into MySQL database

Some people prefer to put their p_w_picpaths into the database, some prefer to keep them on the file system for their applications. Technical difficulties arise when we work with millions of p_w_picpaths. Images are binary data. MySQL database has a special data type to store binary data called BLOB (Binary Large Object).

mysql> describe p_w_picpaths;

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

| Field | Type       | Null | Key | Default | Extra |

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

| id    | int(11)    | NO   | PRI |         |       |

| data  | mediumblob | YES  |     | NULL    |       |

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

2 rows in set (0.00 sec)

This is the table, that we will use in our example. It can be created by the following SQL statement.

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

#include

#include

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, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);

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

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

mysql_real_escape_string(conn, chunk, data, size);

char *stat = "INSERT INTO p_w_picpaths(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);

}

In this example, we will insert one p_w_picpath into the p_w_picpaths table. The p_w_picpath can be max 1 MB.

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

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

Here we open the p_w_picpath and read it into the data array.

mysql_real_escape_string(conn, chunk, data, size);

Binary data can obtain special characters, that might cause troubles in the statements. We must escape them. The mysql_real_escape_string() puts the encoded data into the chunk array. In theory, every character might be a special character. That's why the chunk array two times as big as the data array. The function also adds a terminating null character.

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

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

These two code lines prepare the MySQL query.

mysql_real_query(conn, query, len);

Finally, we execute the query.

Selecting p_w_picpaths from MySQL database

In the previous example, we have inserted an p_w_picpath into the database. In the following example, we will select the inserted p_w_picpath back from the database.

#include

#include

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, "localhost", "zetcode", "passwd", "testdb", 0, NULL, 0);

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

mysql_query(conn, "SELECT data FROM p_w_picpaths 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);

}

In this example, we will create an p_w_picpath file from the database.

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

We open a file for writing.

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

We select an p_w_picpath with id 1.

row = mysql_fetch_row(result);

The row contains raw data.

lengths = mysql_fetch_lengths(result);

We get the length of the p_w_picpath.

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

We create the p_w_picpath file using the fwrite() standard function call.

转载于:https://blog.51cto.com/a1liujin/1686202

mysql C语言API接口及实例相关推荐

  1. Mysql—C语言API接口

    Mysql-C语言API接口 一.mysql-arp访问数据的操作流程 1. 初始化mysql操作句柄: 2. 连接mysql服务器: 3. 设置mysql客户端字符集(保持与服务器一致): 4. 选 ...

  2. mysql c接口_mysql C语言API接口及实例

    Mysql数据库动态库:libmysql.dlllibmysql.libmysql.hWinSock2.h Mysql API数据结构(mysql.h) MYSQL:连接数据库前,必须先创建MYSQL ...

  3. 基于java的圆通快递单号自动识别api接口代码实例

    一.产品介绍 快递单号识别,输入运单号自动识别物流公司,实时返回对应物流公司编码.查询单号时,返回的结果可能存在一个或多个物流公司编码,快递鸟大数据平台通过智能分析,实时更新单号库,保障物流公司编码准 ...

  4. web api接口开发实例_C# 物联网开发API接口系列(4)

    C# 物联网开发API接口系列(四) #久爱物联网#MQTT# [提纲] 1)获取设备列表(某用户的) 2)单独检查设备是否存在合法 [正文] /// /// 获取设备列表 /// /// 令牌 // ...

  5. 股票量化API接口的实例代码分享

    很多人都想自己制作属于自己的量化api接口,但是具体要怎样做呢?没有经验能不能编写出使用的量化api接口呢?今日我们就来聊聊这个话题,顺便给大家分享一套实用的接口代码. 首先,量化api接口并不是任何 ...

  6. 免费的网课API接口附加实例

    免费的网课查题API接口 需要开发网课查询软件的可以参考一下这个api请求接口 请求地址为:http://q.zhizhuoshuma.cn/ 支持http和https请求 请求方式为GET请求 公众 ...

  7. qq空间音乐查询API|经纬度查询API|手机归属地API|Taobao API接口调用实例

    qq空间音乐查询,使用方法如下: //返回xml数据 http://qzone-music.qq.com/fcg-bin/cgi_playlist_xml.fcg?uin=查询的qq号码 //返回js ...

  8. C语言API接口开发,腾讯云服务器 API C语言接口

    腾讯云服务器的官方API和文档非常详尽,但是对于嵌入式设备还不是很友好,为了在项目中开发一个发送短信的功能,写了一个腾讯云服务器的客户端api,抽取了其中框架部分: 腾讯云服务器 API处理的流程: ...

  9. web api接口开发实例_小程序开发如何调用 API 接口,以豆瓣电影为例

    API 调用是开发者在小程序开发过程中经常会遇到的问题,本期我们以为调用豆瓣电影 API 为例具体来看 API 的调用过程以及常见的一些问题. 测试用到的小程序是「电影周周看」,内容来自清华大学软件学 ...

最新文章

  1. android饼状图简书,Charts-饼状图
  2. 159. Leetcode 122. 买卖股票的最佳时机 II (贪心算法-股票题目)
  3. 实现一个函数,对一个正整数n,算得到1
  4. 你们公司内部有WiKi么
  5. 杭电acm 2177 取(2堆)石子游戏(威佐夫博弈)
  6. gulp加速hexo的yelee主题
  7. [css] H5如何禁止显示系统菜单?
  8. 主设备号与次设备号以及申请
  9. imsi序列号_IPhone 获取IMSI序列号
  10. 能够使用StringBuilder类的常用方法操纵字符串 1215
  11. MATLAB学习笔记——二维和三维绘图
  12. java使用hashset_Java集合(二)HashSet的使用
  13. Servlet 自动刷新页面
  14. redis的IM的聊天工具
  15. 003自动装配歧义性解决
  16. 为什么用共有属性来封装私有变量
  17. cocos2dx打飞机项目笔记一:项目结构介绍
  18. 手机直播app制作大揭秘之视频直播系统方案
  19. 因特尔显卡自定义分辨率_事实:在新版本的“英特尔高清图形控制面板”中设置自定义方法...
  20. 【真正的解决方法】error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054

热门文章

  1. Web的诞生和网络基础 | 读《图解HTTP》
  2. Java填坑系列之SparseArray
  3. ssm 使用中的一些问题
  4. JavaScript类型·对象·函数
  5. java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 \ ^
  6. iOS - UISearchController
  7. 15 个最佳的 jQuery 表格插件
  8. 固态存储作缓存 提升性能有绝招
  9. ROS系统的安装 ubuntu 18.04.5 LTS
  10. html5 判断手机电脑,H5_0006:JS判断PC,平板,手机平台的方法