mysql c接口_mysql C语言API接口及实例
Mysql数据库动态库:libmysql.dlllibmysql.libmysql.hWinSock2.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
#include
#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,constchar*host,constchar*user,constchar*passwd,constchar*db,unsignedintport,constchar*unix_socket,unsignedlongclientflag);
参数说明: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.intmain(){
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 <
9.return0;
10.}
11.if(mysql_real_query(&mysql,"select * from user", (unsignedlong)strlen("select * from user"))){// 查询mysql数据库中的user表
12.cout <
13.return0;
14.}// 存储结果集
15.res = mysql_store_result(&mysql);
16.if(NULL == res) {
17.cout <
18.return0;
19.}
20.// 重复读取行,并输出第一个字段的值,直到row为NULL
21.while(row = mysql_fetch_row(res)) {
22.cout <
23.}
24.mysql_free_result(res);// 释放结果集
25.mysql_close(&mysql);// 关闭Mysql连接
26.return0; }
10.Char *mysql_get_client_info()显示mysql客户端版本
MySQL client version: 5.0.38
11.intmysql_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
{
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
{
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
{
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.
mysql c接口_mysql C语言API接口及实例相关推荐
- Mysql—C语言API接口
Mysql-C语言API接口 一.mysql-arp访问数据的操作流程 1. 初始化mysql操作句柄: 2. 连接mysql服务器: 3. 设置mysql客户端字符集(保持与服务器一致): 4. 选 ...
- 阿里巴巴商品详情API接口(item_get-获得商品详情接口),阿里巴巴API接口
阿里巴巴商品详情API接口(item_get-获得商品详情接口),阿里巴巴API接口可获取到商品链接,商品ID,商品标题,商品价格,品牌名称,店铺昵称,sku规格,sku属性,发货地,详情属性,店铺信 ...
- 唯品会关键字搜索商品API接口(item_search-按关键字搜索唯品会商品API接口),唯品会API接口
一.唯品会关键字搜索商品API接口(item_search-按关键字搜索唯品会商品API接口),唯品会API接口接口可获取到宝贝标题,宝贝价格,宝贝ID,宝贝图片,优惠价,宝贝链接,卖家昵称,店铺所在 ...
- 淘宝/天猫/1688拍立淘API接口(以图搜商品API接口,图片搜索API接口,图片搜索商品API接口)代码对接教程
淘宝/天猫/1688拍立淘API接口(以图搜商品API接口,图片搜索API接口,图片搜索商品API接口)代码对接教程如下: 1.公共参数 名称 类型 必须 描述(接口代码教程wx19970108018 ...
- 京东推荐商品列表API接口-(item_recommend-获取推荐商品列表API接口),京东API接口
一.京东推荐商品列表API接口-(item_recommend-获取推荐商品列表API接口),京东API接口代码对接如下: 1.请求参数: 名称 类型 必须 描述 key String 是 调用key ...
- 淘宝/天猫获取卖出的商品订单列表API接口,店铺订单API接口,店铺订单详情API接口
一.淘宝/天猫获取卖出的商品订单列表API接口,店铺订单API接口,店铺订单详情API接口代码如下: 1.公共参数: 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接 ...
- 京东商品详情页API接口、京东商品销量API接口、京东商品列表API接口、京东APP详情API接口、京东详情API接口,京东SKU信息接口
京东商品详情页API接口.京东商品销量API接口.京东商品列表API接口.京东APP详情API接口.京东详情API接口,京东SKU信息接口,通过商品ID提取商品详情页各项数据,包含商品标题,sku i ...
- 京东商品评论API接口-(item_review-获得JD商品评论API接口),京东API接口
一.京东商品评论API接口-(item_review-获得JD商品评论API接口),京东API接口代码对接如下: 1.公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GE ...
- 京东店铺的所有商品API接口-(item_search_shop-获得店铺的所有商品接口),京东API接口
一.京东店铺的所有商品API接口-(item_search_shop-获得店铺的所有商品接口),京东API接口代码如下: 1.公共参数 名称 类型 必须 描述 key String 是 调用key(必 ...
最新文章
- 图灵出品的人气O'Reilly动物书,你更钟意哪本?
- FPGA的设计艺术(11)FPGA的构建过程
- 中央空调“国进外退”,格力、美的、海尔三大白如何角逐新市场?
- poj 2503 Trie树
- [nginx报错]---unknown directive chunkin in /XXXXX/XXXXXX:XX的几种解决方式
- asp.net 递归删除文件夹及其子文件夹和所有文件[转]
- 软件测试必备工具安装包
- ASP.NET删除等操作前的提示解决方案
- Python学习笔记之 函数基础,pass
- 华为手机投屏电脑_手机投屏干货分享:华为如何投屏到电视机?
- 显卡mx150和230哪个好_MX130与MX150差距对比分析
- 8位可控加减法电路设计
- 机器视觉/图像处理可能用到的三方库(各个库的优缺点)
- 网络安全立法探讨(Cyber Security Laws discussion):立法是否应该更严格?
- 8.利用红外遥控信号控制LED灯的亮灭
- Codeforces - 1428E. Carrots for Rabbits
- 随机过程在计算机领域的应用,清华大学出版社-图书详情-《随机过程及其在金融领域中的应用(第2版)》...
- Java核心卷Ⅱ(原书第10版)笔记(上)
- python k线图_如何用python画K线图(成交量+MACD+KDJ)
- 徐志摩的再别康桥 .
热门文章
- 五年级计算机课程内容,五年级信息技术教学计划
- php怎么获取权限操作 shell,利用php利用root权限执行shell脚本必须进行以下几个步骤...
- sap脚本运行_如何使用Python脚本运行SAP?
- mysql 系统月份_MySQL里求给定的时间是所在月份的第几个星期
- 计算机aero背景黑,Win7中Aero下面的主题变为黑色
- JAVA中几种循环结构的表示_本文通过实例讲解给大家介绍Java中for、while、do while三种循环语句的区别,具体详情如下所示:第一种:for循环 循环结构for语句的格式...
- 64位系统下一个32位的程序究竟可以申请到多少内存?
- java151和152_编写高质量代码:改善Java的151个建议(性能和效率)132-133
- 配置 HTTP 与 DNS 功能
- Sublime的Package Control安装方法