mysql c api example_The MySQL C API 编程实例

在网上找了一些MYSQL C API编程的文章,看了后认为还是写的不够充分,依据自己经验写了这篇《The MySQL C API 编程实例》,希望对须要调用到MYSQL的C的API的朋友有所帮助,附例中的环境为RedHat

在这篇文章里,我们将学会怎么使用MySQL 的C APIs(Application Programming Interfaces 编程接口)。为了非常好地了解这篇文章,您须要具备下面前提知识:

C语言变量

C语言函数

C语言指针

简单介绍

C APIs包括在mysqlclient库文件其中与MySQL的源码一块发行,用于连接到数据库和运行数据库查询。有一些样例在MySQL原代码的clients文件夹里。

MySQL C 变量类型

下面变量类型在MySQL的库其中定义。我们须要这些变量是为了使用MySQL的函数。这些变量有具体的解释,可是这些解释对于写代码来说并不重要。

MYSQL

下面代码块是用来连接数据库的通讯过程,要连接MYSQL,必须建立MYSQL实例,通过mysql_init初始化方能開始进行连接,这个在后面会讲到。

typedef struct st_mysql {NETnet;/* Communication parameters */gptrconnector_fd;/* ConnectorFd for SSL */char*host,*user,*passwd,*unix_socket,*server_version,*host_info,*info,*db;unsigned intport,client_flag,server_capabilities;unsigned intprotocol_version;unsigned intfield_count;unsigned intserver_status;unsigned long thread_id;/* Id for connection in server */my_ulonglong affected_rows;my_ulonglong insert_id;/* id if insert on table with NEXTNR */my_ulonglong extra_info;/* Used by mysqlshow */unsigned long packet_length;enum mysql_status status;MYSQL_FIELD*fields;MEM_ROOTfield_alloc;my_boolfree_me;/* If free in mysql_close */my_boolreconnect;/* set to 1 if automatic reconnect */struct st_mysql_options options;charscramble_buff[9];struct charset_info_st *charset;unsigned intserver_language;} MYSQL;

MYSQL_RES

这个结构代表返回行的一个查询的(SELECT, SHOW, DESCRIBE, EXPLAIN)的结果。返回的数据称为“数据集”,用过数据库的朋友应该对数据库中查询后得到的结果集不会陌生,在C的API里相应的就是MYSQL_RES了,从数据库读取数据,最后就是从MYSQL_RES中读取数据。

typedef struct st_mysql_res {my_ulonglong row_count;unsigned intfield_count, current_field;MYSQL_FIELD*fields;MYSQL_DATA*data;MYSQL_ROWS*data_cursor;MEM_ROOTfield_alloc;MYSQL_ROWrow;/* If unbuffered read */MYSQL_ROWcurrent_row;/* buffer to current row */unsigned long *lengths;/* column lengths of current row */MYSQL*handle;/* for unbuffered reads */my_booleof;/* Used my mysql_fetch_row */} MYSQL_RES;

MYSQL_ROW

这是一个行数据的类型安全(type-safe)的表示。当前它实现为一个计数字节的字符串数组。(假设字段值可能包括二进制数据,你不能将这些视为空终止串,由于这种值能够在内部包括空字节) 行通过调用mysql_fetch_row()获得。

typedef char **MYSQL_ROW;

MYSQL_FIELD

这个结构包括字段信息,比如字段名、类型和大小。其成员在以下更具体地描写叙述。你能够通过反复调用mysql_fetch_field()对每一列获得MYSQL_FIELD结构。字段值不是这个结构的部分;他们被包括在一个MYSQL_ROW结构中。

typedef struct st_mysql_field {char *name;/* Name of column */char *table;/* Table of column if column was a field */char *def;/* Default value (set by mysql_list_fields) */enum enum_field_types type;/* Type of field. Se mysql_com.h for types */unsigned int length;/* Width of column */unsigned int max_length;/* Max width of selected set */unsigned int flags;/* Div flags */unsigned int decimals;/* Number of decimals in field */} MYSQL_FIELD;

my_ulonglong

typedef unsigned long my_ulonglong;

该类型用于行编号和mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()。这种类型提供0到1.84e19的一个范围。在一些系统上,试图打印类型my_ulonglong的值将不工作。为了打印出这种值,将它变换到unsigned long而且使用一个%lu打印格式。比如:

printf (Number of rows: %lu/n", (unsigned long) mysql_num_rows(result));

连接MySQL,查询数据

如今如果MySQL已安装,用户和数据表在数据库被创造。以防有什么不明问题的情况,请參考站点。

前面已经说过,MySQL的库文件在mysqlclient。因此在编译MySQL程序的时候有必要加上-lmysqlclient编译选项。MySQL的头文件在/usr/include/mysql文件夹下(依据Linux的发行版本号的不同,这个文件夹也有所不同),因此你的程序头部看起来有点这个样子:

#include

MySQL的变量类型和函数都包括在这个头文件其中

然后,我们须要创建连接数据库的变量,能够简单地这么做:

MYSQL mysql;

在连接数据库之前,我们要调用下面函数初始化这个变量:

mysql_init(&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 int clientflag);

该函数被调用连接到数据库。host是MySQLserver的主机名,user是登录的username,passwd是登录password,db是要连接的数据库,port是MySQLserver的TCP/IP端口,unix_socket是连接类型,clientflag是MySQL执行成ODBC数据库的标记。在这篇文章其中该标记设成0,连接寻建立后,这个函数返回0。

如今能够连接数据库,进行查询了:

char *query;

使用这个字符串我们能够创立不论什么SQL查询语句进行查询。运行这个查询的函数是:

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

mysql是我们前面用过的变量,q是SQL查询语句,length是这个查询语句的长度。假设查询成功,函数返回0。

查询之后,我们要到一个MYSQL_RES变量来使用查询的结果。下面这行创立这个变量:

MYSQL_RES *res;

然后

res = mysql_store_result(&mysql);

对client而言,有两种方法处理结果集合。一种方法是通过调用mysql_store_result()立马检索所有结果。该函数从server获得查询返回的所有行,并将他们存储在client。另外一种方法是对客户通过调用mysql_use_result()初始化一个一行一行地结果集合的检索。该函数初始化检索,可是实际上不从server获得不论什么行。

在两种情况中,你通过mysql_fetch_row()存取行。用mysql_store_result()、mysql_fetch_row()储存取已经从server被取出的行。用mysql_use_result()、mysql_fetch_row()实际上从server检索行。调用mysql_fetch_lengths()可获得关于每行中数据值尺寸的信息。

在你用完一个结果集合以后,调用mysql_free_result()释放由它使用的内存。

两种检索机制是互补的。客户程序应该选择最适合他们的要求的途径。在实践中,客户通常更愿意使用mysql_store_result()。

该函数读出查询结果。

虽然能够非常easy地查询了,要用这个查询的结果还要用到其他的函数。第一个是:

MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);

该函数把结果转换成“数组”。你可能注意到了,该函数返回的是MYSQL_ROW变量类型。下面语句创立那样的变量:

MYSQL_ROW row = mysql_fetch_row(res)

如前所解释的,变量row是一个字符串数组。也就是说,row[0]是数组的第一个值,row[1]是数组的第二个值...当我们用mysql_fetch_row的时候,接着变量row会取得结果的下一组的数据。当到了结果的尾部,该函数返回一负值。

使用数据集结束后,记得释放数据集,否则会发生内存泄漏,释放数据集函数例如以下:

void mysql_free_result(MYSQL_RES *result)

释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为一个结果集合分配的内存。当你用完了一个结果集合时,你必须调用mysql_free_result()来释放它使用的内存。

最后我们要关闭这个连接:

mysql_close(&mysql);

样例程序

运行一个select操作,从数据库中取数据,并运行一个insert操作,往数据库中插入数据,依据这两个操作你能够自由的扩展为随意数据库操作,

准备条件

1、已经安装mysql,上有数据库test,假设没有运行

Create Databse test

建立数据库

2、test数据库上有表t1,假设没有,运行

CREATE TABLE `t1` (

`id` int(11) default NULL,

`name` varchar(100) default NULL

)

建立表t1

testsql.c:

/* testsql.c** An example to use MYSQL C API

** Copyright 2004 Coon Xu.

** Author: Coon Xu

** Date:05 Nov 2004*/

#include

#include int main(){MYSQL mysql;     // need a instance to init

MYSQL_RES *res;

MYSQL_ROW row;

char *query;

int t,r;// connect the databasemysql_init(&mysql);

if (!mysql_real_connect(&mysql,"localhost", "mmim", "mmim", "test",0,NULL,0))

{

printf( "Error connecting to database: %s/n",mysql_error(&mysql));

}

else printf("Connected.../n");// get the result from the executing select query

query = "select * from t1";

t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));

if (t)

{

printf("Error making query: %s/n",

mysql_error(&mysql));

}

else printf("[%s] made.../n", query);res = mysql_store_result(&mysql);while(row = mysql_fetch_row(res))

{

for(t=0;t

{

printf("%s ",row[t]);

}

printf("/n");

}

printf("mysql_free_result.../n");

mysql_free_result(res);     //free result after you get the result

sleep(1);

// execute the insert query

query = "insert into t1(id, name) values(3, ‘kunp‘)";

t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));

if (t)

{

printf("Error making query: %s/n",

mysql_error(&mysql));

}

else printf("[%s] made.../n", query);

mysql_close(&mysql);

return 0;

}

编译

假定mysql的头文件在/usr/include/mysql,库文件在/usr/lib/mysql,运行下列命令进行编译:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【youcans 的 OpenCV 例程200篇】结束语

【youcans 的 OpenCV 例程200篇】总目录 【youcans 的 OpenCV 例程200篇】结束语 【youcans 的 OpenCV 例程】真的写到了 200篇,迎来了“结束语”。 本系列原名【OpenCV 例程 100篇】,从 2021年 11月开始写作,原计划每天写一篇,写…

java aspose 导出word_使用aspose.word 第三方的插件实现导出word

#region 生成的excel文件命名和确保文件的唯一性Random rd new Random();DateTime dtime DateTime.Now;string Filename "培训需求表" dtime.Year.ToString() dtime.Month.ToString() dtime.Day.ToString() dtime.Hour.ToString() dtime.Minute.ToString() …

智能家居(1)行业发展分析

1 智能家居系统 智能家居是基于物联网技术,由硬件系统、软件系统、云计算平台构成一个家庭生态圈,为用户提供安全、便利、舒适的家居生活环境。 具体而言,智能家居以住宅为单位、以家庭生活为背景,以综合布线技术、网络通信技术…

redis 高级实用教程

一、设置redis外网访问 更改redis.conf 文件 # vim redis.conf bind 127.0.0.1 # 注释掉改行 protected-mode yes # 更改模式为no(redis3.2后)二、设置密码验证 更改redis.conf配置文件 requirepass redhat或者通过set设置 127.0.0.1:6284>…

java学到哪里最容易蒙,蒙哥比vs蒙克(目前最好的哪个)

Im planning to integrate mongodb based migration tool in my spring boot application which is having spring-data dependency in project. I found main two libraries 1) Mongobee 2) Mongock.I need some feedback which one should i choose ? Thanks in advance!解决…

LaTex实战笔记 4-插入 Python 程序代码块

LaTex插入 Python 程序代码块1. 需求描述和解决方案2. minted 包的安装与配置2.1 安装 Python 第三方库 Pygments2.2 下载和安装 minted 宏包2.3 配置 LaTeX 编译环境3. minted 包的使用3.1 基本使用3.2 扩展使用3.2.1 \mint 命令行3.2.2 \mintinline 行内使用3.2.3 \inputmint…

Redis 安装与配置

Redis 安装与配置 Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases。 这里我们下载 Redis-x64-xxx.zip 解压到指定目录:  打开命令行(cmd)跳转至解压路径,并运行安装命令,结果如图 C:\U…

智能家居(2)智能体验与智能交互

1. 智能体验的分析与讨论 随着信息和网络技术的发展,可以网络连接的电子电器产品越来越丰富,智能家居、智慧园区、智能汽车等智能控制系统和产品应用越来越广泛。 智能交互终端是智能控制系统的人机交互接口,既是实现智能功能的重要载体&am…

netbeans java9_Java 开发新选择?Apache NetBeans IDE 9.0 备受好评

Apache NetBeans 9.0 目前已发布 Beta 版本,离正式版本越来越近。9.0 版本的主要目标囊括 Oracle 捐赠的大量代码,以及提供 Java 9 和 10 支持。Apache NetBeans 近期在社区上发起了一项满意度调查,用于验收用户如何对 9.0 版本的看法&#x…

LaTex实战笔记 1-快速入门

LaTex插入 Python 程序代码块1. 为什么用 LaTeX?2. LaTeX 的安装与配置2.1 安装 TeXLive2.2 选择 LaTeX 编辑器3. LaTeX 的初次使用3.1 最短的 LaTeX 示例3.2 从模板创建文档3.3 编译生成 PDF 文件4. 基于模板编辑文档4.1 tex 模板的基本结构4.2 基于模板编辑排版5.…

Redis 常见命令

Redis一共有5种数据类型 : String(字符串) List(列表)Hash(字典) Set(集合)Sorted Set(有序集合) 不同的数据类型,有不同的命令方式…

java fx 皮肤_JavaFX 皮肤功能

作为RIA技术之一,为了让应用程序的界面看起来更加的漂亮或者更有个性,皮肤功能自然是必不可少的。在JavaFX中,可以使用CSS样式表来进行皮肤的更换。不过JavaFX中的CSS是基于W3C CSS version 2.1,但又不完全相同。JavaFX中的换肤有…

LaTex实战笔记 2-文档层次与结构

LaTeX 支持结构化文档的编写。 什么是结构化文档?会议论文、期刊论文、学位论文,这类有统一结构、统一版式的文档,是典型的结构化文档。而报刊文章的结构则因人而异,因文而异,是典型的非结构化文档。 1. 结构化文档的…

java爬取小说

使用Java爬取网站:http://www.shicimingju.com的小说内容 代码详解 1.在本地创建存储位置 2.编写正则表达式 3.循环获取内容 4.把内容存入文件夹中 5.判断成功或失败 效果演示 代码展示 package text;import java.io.BufferedReader;import java.io.BufferedWri…

java json u0026_特殊字符的json序列化

先来看一段golangpackage mainimport ("encoding/json""fmt")func main() {data : map[string]string{"str0": "Hello, world","str1": ""str2": ">","str3": "&",}js…

智能家居(3)智能交互的竞品分析

智能家居系统与产品的交互方式,早已从物理按键、遥控操作发展为以触摸面板手机APP作为主要的交互方式,并已经实现了语音交互、生物识别等新技术的导入,未来可能会流行基于视觉的交互方式、基于机器学习的无感交互方式。融合这些交互方式的多模…

java爬取单张图片

我们经常需要在网页上获取一些图片,有的图片我们是可以直接下载使用,有的图片需要我们登陆账号甚至付费下载,所以在此我写了一个使用Java爬取任意网页单张图片的爬虫。 代码解析 1.图片的网络位置 2.进行访问和下载 3.建立本地存储位置 效果…

四川大学java语言程序设计_四川大学2014年计算机(软件)学院Java语言设计期末考试B卷程序.doc...

四川大学期末考试试题(闭卷)(2014-2015学年第2学期)课程号: 课程名称: Java语言程序设计(B 卷)任课教师:适用专业年级: 学号: 姓名:考试须知四川大学学生参加由学校组织或由学校承办的各级各类考试&#xf…

LaTex实战笔记 3-宏包与控制命令

1. LaTeX 命令的基本架构 LaTex 排版系统对于格式控制、公式编辑比 Word 更加灵活、准确。 Tex 环境中,字符、图片等各种文档内容都装在不同的盒子(box)容器内。这些盒子根据 Tex/Latex 的默认规则和控制命令组合为更大的盒子。字符组合为单…

【OpenCV 例程200篇】201. 图像的颜色空间转换

OpenCV 例程200篇 总目录 201. 图像的颜色空间转换 202. 查表快速替换(cv.LUT) 203. 伪彩色图像处理 204. 图像的色彩风格滤镜 205. 调节色彩平衡/饱和度/明度 文章目录【youcans 的 OpenCV 例程200篇】201. 图像的颜色空间转换图像的色彩空间基础图像的…