利用MySQL自带的C API函数实现数据库功能调用

合集下载

linux下使用libmysql++库操作mysql的C API

linux下使用libmysql++库操作mysql的C API

linux下使用libmysql++库操作mysql的C API系统环境Ubuntu 12.041、安装mysqlubuntu下安装mysql是比较简单的,直接通过apt-get安装1.sudo apt-get install mysql-server-5.52、登入mysql1.mysql [-h host_name][-u user_name][-p password]其中参数-h后面要给出连接的数据库的IP地址或者域名、参数-u后面要给出登录的用户名、参数-p表示登录的密码。

有时连接本机默认的Mysql数据库服务器,则可以直接在命令行中输入如下简写形式(root用户):1.mysql -u root -p之后,系统会提示你输入root用户的密码3、mysql的基本命令在mysql中,输入help或者?命令,即可用查看mysql支持的内部操作命令。

(1)显示数据库列表显示数据库列表命令比较简单,直接输入show databases;即可。

(2)选择一个数据库选择一个数据库比较简单,使用use dbname,其中dbname为要选择的数据库名字。

比如,这里我们选择test数据库:(3)查看一个数据库中的所有表通过show tables,可以查看一个数据库中所有的数据库表。

(4)退出简单的命令,quit;需要注意的是,每个命令后面需要加上分号“;”,因为分号表示一个事务的结束。

4、mysql数据库操作实例。

(1)创建班级数据库创建数据库的命令式create databases dbname,其中dbname为数据库名,例如当前要创建的数据库名为class,因此需要输入下面的命令:1. mysq->create database class;(2)创建学生信息表1. mysql>use class;2. mysql>create table student (nid INT UNIQUE,name VARCHAR(20),age int);(3)插入基本数据向已经创建好的数据表中插入3条基本记录,SQL语句如下:1. mysql->insert into student values(100,'Lee', 16);2. mysql->insert into student values(101,'Tom', 17);3. mysql->insert into student values(102,'Harry', 15);(4)查询全部数据利用select语句查询全部记录。

mysql数据库接口的vc实现与应用

mysql数据库接口的vc实现与应用

mysql数据库接口的vc实现与应用(一)摘要:mysql数据库作为一种网络数据库性能十分出色,但其在应用软件中使用较少。

本文将主要探讨mysql提供的两种数据库接口——(odbc api和c api)在vc中的应用,并且形成一个类用以封装c api数据库接口的功能。

关键词:mysql;数据库接口;odbc api;c api引言随着现代计算机软硬件及网络技术的发展,在网上查找资料已成为现在获取信息的最重要手段之一。

众所周知,所有的网上信息都是储存在网站数据库中的,这些信息的查询、更新等操作的功能则是由数据库服务器提供的,显然,数据库服务器的性能将直接关系到网站的生存。

网站搭建中用的最多的数据库服务器是oracle和mysql,前者功能强大,属于旗舰型数据库服务器,但前期投入太大;后者功能不断完善,简单易用而又不失性能,并且可以免费获得。

因此,许多中小型网站的数据库服务器选用mysql,而且,由于mysql性能出色,一些大型网站也选用了mysql。

由此可见,mysql数据库服务器在网站建设中的表现是十分出色的。

但是,正因为这样,几乎很少有人将mysql用于应用软件的开发中。

本文将详细介绍vc环境中mysql数据库服务器不同接口的应用,并最终将产生一个cdatabase类封装mysql数据库接口功能。

数据库接口实现与应用的计算机环境:硬件,c466、128m、15g;软件及操作系统,visual c++ 6.0、mysql 3.23.22-beta for win32、win98。

1 mysql数据库简介mysql是一个真正的多用户、多线程sql数据库服务器。

sql(结构化查询语言)是世界上最流行的和标准化的数据库语言,它使得存储、更新和存取信息更加容易。

mysql是一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和许多不同的客户程序以及库组成的。

mysql的主要目标是快速、健壮和易用。

用C调用mysql数据库的存储过程

用C调用mysql数据库的存储过程

用C调用mysql数据库的存储过程1 在mysql中的test数据库中建表:use test;create table tt(id int,name varchar(20));2 插入一些数据:insert into tt values (1,’wlw’),(2,’ssg’);select * from tt;+--------+----------+| id | name |+---------+----------+| 1 | wlw || 2 | ssg |+---------+---------+2 rows in set (0.00 sec)3 创建一个简单的存储过程:delimiter //create procedure insertValue()begininsert into tt values (3,’wjx’);end//delimiter ;4 在linux下创建insert.c文件#include <stdio.h>#include <string.h>#include <mysql/mysql.h>int main(){MYSQL mysql; // need a instance to initMYSQL_RES res;MYSQL_ROW row;char query[256];int t;// connect the databasemysql_init(&mysql);if(!mysql_real_connect(&mysql,"127.0.0.1","root","root","test",0,NULL,CLIENT_MULTI_STA TEMENTS)){printf( "Error connecting to database: %s\n",mysql_error(&mysql));}else {printf("Connected...\n");// get the result from the executing select querystrcpy(query,"call addValue()");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;}}5 编译insert.c 文件:gcc -o insert insert.c -L/usr/ -L/usr/lib/mysql -lmysqlclient -lmysqlclient –lz6 执行生成文件insert./insert执行结果:[root@wlw c]# ./insertConnected...[call addValue()] made...7 查看数据库:mysql> select * from tt;+------+------+| id | name |+------+------+| 1 | wlw || 2 | ssg || 3 | wjx |+------+------+3 rows in set (0.00 sec)。

使用C语言调用mysql数据库编程实战以及技巧

使用C语言调用mysql数据库编程实战以及技巧

使⽤C语⾔调⽤mysql数据库编程实战以及技巧今天编写使⽤C语⾔调⽤mysql数据库编程实战以及技巧。

为其它IT同⾏作为參考,当然有错误能够留⾔,共同学习。

⼀、mysql数据库的C语⾔经常使⽤接⼝API1.⾸先当然是链接数据库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是C语⾔api中⼀个很重要的变量。

⾥⾯内存很丰富。

有port,dbname,charset等连接基本參数。

它也包括了⼀个叫st_mysql_methods的结构体变量,该变量⾥⾯保存着许多函数指针。

这些函数指针将会在数据库连接成功以后的各种数据操作中被调⽤。

mysql_real_connect函数中各參数,基本都是顾名思意。

2.连接数据库成功之后就能够使⽤mysql_query运⾏sql语句。

原型例如以下:int STDCALL mysql_query(MYSQL *mysql, const char *q);第⼀个參数上⾯已经介绍过。

第⼆个參数为要运⾏的sql语句,主要就是运⾏SQL语句的增、删、改、查等功能。

这个函数整体就两步:(1)发送sql语句,事实上就⼀个socket发送sql 语句,加上mysql固定的协议头。

(2)然后就是接受结果,这⾥将会调⽤MYSQL变量中的st_mysql_methods中的read_query_result函数指针a 假设包括⼆进制数据的查询,要使⽤mysql_real_query.b 检查受查询影响的⾏数:my_ulonglong mysql_affected_rows(MYSQL *connection);my_ulonglong是⽆符号长整形,为%lu格式这个函数返回受之前运⾏update,insert或delete查询影响的⾏数。

(个人整理)Mysql C API

(个人整理)Mysql C API

25.2.1. C API数据类型∙MYSQL该结构代表1个数据库连接的句柄。

几乎所有的MySQL函数均使用它。

不应尝试拷贝MYSQL 结构。

不保证这类拷贝结果会有用。

∙MYSQL_RES该结构代表返回行的查询结果(SELECT, SHOW, DESCRIBE, EXPLAIN)。

在本节的剩余部分,将查询返回的信息称为“结果集”。

∙MYSQL_ROW这是1行数据的“类型安全”表示。

它目前是按照计数字节字符串的数组实施的。

(如果字段值可能包含二进制数据,不能将其当作由Null终结的字符串对待,这是因为这类值可能会包含Null字节)。

行是通过调用mysql_fetch_row()获得的。

∙MYSQL_FIELD该结构包含关于字段的信息,如字段名、类型和大小。

这里详细介绍了其成员。

通过重复调用mysql_fetch_field(),可为每个字段获得MYSQL_FIELD结构。

字段值不是该结构的组成部份,它们包含在MYSQL_ROW结构中。

∙MYSQL_FIELD_OFFSET这是MySQL字段列表偏移量的“类型安全”表示(由mysql_field_seek()使用)。

偏移量是行内的字段编号,从0开始。

∙my_ulonglong用于行数以及mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()的类型。

该类型提供的范围为0~1.84e19。

在某些系统上,不能打印类型my_ulonglong的值。

要想打印这类值,请将其转换为无符号长整数类型并使用%lu打印格式,例如:printf ("Number of rows: %lu\n", (unsigned long) mysql_num_rows(result));下面列出了MYSQL_FIELD结构包含的成员:· char * name字段名称,由Null终结的字符串。

如果用AS子句为该字段指定了别名,名称的值也是别名。

MySQL中文参考手册MySQL学习总结-MySQL-API函数描述

MySQL中文参考手册MySQL学习总结-MySQL-API函数描述

MySQL函数描述、学习总结(适用版本:MySQL 3.23.7alpla)1. MySQL API (2)1.1. MySQL C API (2)1.2. C API数据类型 (3)1.3. C API函数概述 (6)1.4. C API函数描述 (9)1.4.1. mysql_affected_rows() (10)1.4.2. mysql_close() (11)1.4.3. mysql_connect() (11)1.4.4. mysql_change_user() (12)1.4.5. mysql_create_db() (13)1.4.6. mysql_data_seek() (14)1.4.7. mysql_debug() (15)1.4.8. mysql_drop_db() (15)1.4.9. mysql_dump_debug_info() (16)1.4.10. mysql_eof() (17)1.4.11. mysql_errno() (18)1.4.12. mysql_error() (19)1.4.13. mysql_escape_string() (20)1.4.14. mysql_fetch_field() (21)1.4.15. mysql_fetch_fields() (22)1.4.16. mysql_fetch_field_direct() (23)1.4.17. mysql_fetch_lengths() (23)1.4.18. mysql_fetch_row() (24)1.4.19. mysql_field_count() (26)1.4.20. mysql_field_seek() (27)1.4.21. mysql_field_tell() (28)1.4.22. mysql_free_result() (28)1.4.23. mysql_get_client_info() (29)1.4.24. mysql_get_host_info() (29)1.4.25. mysql_get_proto_info() (30)1.4.26. mysql_get_server_info() (30)1.4.27. mysql_info() (30)1.4.28. mysql_init() (31)1.4.29. mysql_insert_id() (32)1.4.30. mysql_kill() (32)1.4.31. mysql_list_dbs() (33)1.4.32. mysql_list_fields() (34)1.4.33. mysql_list_processes() (35)1.4.34. mysql_list_tables() (35)1.4.35. mysql_num_fields() (36)1.4.36. mysql_num_rows() (38)1.4.37. mysql_options() (38)1.4.38. mysql_ping() (40)1.4.39. mysql_query() (41)1.4.40. mysql_real_connect() (41)1.4.41. mysql_real_query() (43)1.4.42. mysql_reload() (44)1.4.43. mysql_row_seek() (45)1.4.44. mysql_row_tell() (45)1.4.45. mysql_select_db() (46)1.4.46. mysql_shutdown() (47)1.4.47. mysql_stat() (47)1.4.48. mysql_store_result() (48)1.4.49. mysql_thread_id() (49)1.4.50. mysql_use_result() (50)1.4.51. 为什么在mysql_query()返回成功后,mysql_store_result()有时返回NULL? (51)1.4.52. 我能从查询中得到什么结果? (51)1.4.53. 我怎样能得到最后插入的行的唯一ID? (52)1.MySQL API1.1. MySQL C APIC API代码是随MySQL分发的,它被包含在mysqlclient库且允许C程序存取一个数据库。

在MySQL中使用用户自定义函数提升查询功能

在MySQL中使用用户自定义函数提升查询功能

在MySQL中使用用户自定义函数提升查询功能随着互联网和大数据时代的到来,数据处理和查询功能的需求日益增长。

在MySQL数据库中,用户自定义函数(User-Defined Functions,简称UDF)是一项非常重要的功能,可以提升数据库查询的性能和灵活性。

本文将从概述UDF的作用和原理开始,介绍如何在MySQL中使用用户自定义函数来提升查询功能。

一、概述UDF的作用和原理用户自定义函数是指用户根据自己的需求编写的特定功能的函数。

在MySQL 中,用户可以通过使用C/C++编写自己的函数,并将其编译为动态链接库(DLL)。

然后将这些DLL导入MySQL,就可以在SQL语句中调用这些用户自定义函数了。

UDF的作用非常广泛,可以用于各种复杂的数据处理和计算任务。

例如,可以使用UDF来进行字符串处理、数值计算、日期转换等。

通过使用UDF,用户可以自定义自己的函数,以满足特定的业务需求。

UDF的原理是通过将自定义的函数编译为动态链接库,然后将这些动态链接库加载到MySQL中,使得MySQL可以调用这些函数。

UDF的编写语言通常是C/C++,因为MySQL使用C/C++作为其底层的开发语言。

二、使用UDF提升查询功能的方法在MySQL中使用UDF提升查询功能有多种方法,下面将介绍其中的几种常见方法。

1. 自定义聚合函数聚合函数是用于对数据进行汇总计算的函数,如求和、平均值、最大值等。

MySQL内置了一些常见的聚合函数,但有时候这些内置函数不能满足我们的需求。

这时候,我们可以使用UDF来自定义聚合函数。

例如,我们需要计算某列数据的标准差,而MySQL并没有提供标准差的内置函数。

这时候,我们可以使用UDF来自定义一个标准差函数,以满足我们的需求。

2. 自定义排序规则在MySQL中,排序是非常频繁的操作。

虽然MySQL提供了一些内置的排序规则,但有时候这些内置规则并不能满足我们的需求。

这时候,我们可以使用UDF来自定义排序规则。

C++连接mysql数据库的两种方法小结

C++连接mysql数据库的两种方法小结

C++连接mysql数据库的两种⽅法⼩结现在正做⼀个接⼝,通过不同的连接字符串操作不同的数据库。

要⽤到mysql数据库,以前没⽤过这个数据库,⽤access和sql server⽐较多。

通过⽹上的⼀些资料和⾃⼰的摸索,⼤致清楚了C++连接mysql的⽅法。

可以通过2种⽅法实现。

第⼀种⽅法是利⽤ADO连接,第⼆种⽅法是利⽤mysql⾃⼰的api函数进⾏连接。

第⼀种⽅法可以实现我当前的需求,通过连接不同的字符串来连接不同的数据库。

暂时只连接了mysql,sqlserver,oracle,access。

对于access,因为它创建表的SQL 语句不太兼容标准SQL语句,需要做⼀些处理,这⾥暂时不说。

第⼆种⽅法只能针对于mysql数据库的连接,不过⽤这种⽅法不⽤安装MyODBC服务器程序。

不管⽤哪种⽅法,⾸先需要安装Mysql数据库,安装⽅法请看“mysql安装及⼀些注意点”。

最好安装⼀个Navicat for mysql,⽅便操作mysql数据库。

下⾯分别说下这两种⽅法:(⼀)通过ADO连接MySql数据库1、通过ADO连接MySql数据库,⾸先得安装MyODBC服务器程序。

MyODBC版本要和MySql的版本对应上,否则会连接不上数据库。

我⽤的版本分别是mysql-5.1.48-win32.msi和mysql-connector-odbc-5.1.5-win32.msi。

安装好后,点击开始菜单->设置->控制⾯板->管理⼯具->数据源(ODBC)->⽤户DSN->添加->选择MySQL ODBC 5.1 Driver。

如下图:然后双击MySQL ODBC 5.1 Driver进⾏配置。

配置好可以点Test进⾏下测试(如下图),如果能连上会弹出connection successful对话框。

上图中的Data Source Name:中的内容就是代码⾥DSN所对应的值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3 利用MySQL自带的C API函数实现数据库功能调用由于各个数据库之间的差异,它们所提供的数据库功能也就各有不同。

这样,通过ODBC API就不可能完全拥有所有的数据库功能,因而影响了程序对数据库的控制功能,也就不能充分发挥数据库的能力。

并且这种统一的接口还是以损失效能为前提的,这就使数据库操作时间延长。

所以,为了解决以上问题,MySQL 的制造商在提供ODBC驱动程序的基础上,还提供了各种编程环境下的API,其中包括 C API。

这些API函数很显然能尽可能地发挥数据库的能力,并减少数据库操作的延长时间,但却使程序的通用性受到严重影响。

MySQL提供了一套C API函数,它由一组函数以及一组用于函数的数据类型组成,这些函数与MySQL 服务器进行通信并访问数据库,可以直接操控数据库,因而显著地提高了操控效能。

C API数据类型包括:MYSQL(数据库连接句柄)、MYSQL_RES(查询返回结果集)、MYSQL_ROW(行集)、MYSQL_FIELD(字段信息)、MYSQL_FIELD_OFFSET(字段表的偏移量)、my_ulonglong(自定义的无符号整型数)等;C API提供的函数包括:mysql_close()、mysql_connect()、mysql_query()、mysql_store_result()、mysql_init()等,其中mysql_query()最为重要,能完成绝大部分的数据库操控。

下面将具体讨论数据库操作类CDatabase通过C API的实现以及在VC中的应用。

3.1 CDatabase类的实现CDatabase类封装了MySQL数据库的功能,因此不具备通用性,只能在对MySQL 的应用程序中使用。

下面将根据C++要求及规范给出CDatabase类的具体结构以及相关简要介绍:class CDatabase{public:BOOL UnLockTable(); //解锁BOOL LockTable(char* TableName,char* PRIORITY); //加锁int Reload(); //重新登陆,非零时返回错误信息char* GetState(); //服务器状态char* GetServerInfo(); //服务器信息int GetProtocolInfo(); //协议信息char* GetHostInfo(); //主机信息char * GetClientInfo(); //客户机信息char* GetFieldName(int FieldNum); //字段名BOOL IsEnd(); //是否最后int DropDB(char *db); //删除数据库,非零时返回错误信息void SeekData(int offset); //查找指定数据int CreateDB(char *db); //创建数据库,非零时返回错误信息void FreeRecord(); //释放结果集unsigned int GetFieldNum(); //得到字段数BOOL ConnectDB(Database_Param *p); //连接数据库MYSQL_ROW GetRecord(); //得到结果(一个记录)my_ulonglong GetRowNum(); //得到记录数BOOL SelectDB(Data_Param *para); //选择数据库BOOL UpdateRecord(Data_Param *para); //更新记录BOOL SelectRecord(Data_Param *para); //选择记录BOOL InsertRecord(Data_Param *para); //插入记录BOOL DelRecord(Data_Param *para); //删除记录BOOL SelectAll(Data_Param *para); //选择所有记录char * OutErrors(); //输出错误信息CDatabase(); //初始化数据库virtual ~CDatabase(); //关闭数据库连接private:MYSQL mysql; //数据库连接句柄MYSQL_RES *query; //结果集MYSQL_ROW row; //记录集MYSQL_FIELD *field; //字段信息(结构体)BOOL FindSave(char *str); //查找并保存结果集};通过CDatabase类中定义的这些功能函数,我们可以通过远程或本机完成对MySQL数据库的绝大部分操控,并且由于定义了解锁和加锁功能,使得应用程序能够多线程或多进程地访问数据库,大大提高了效能。

以上函数的具体功能都是通过调用C API函数实现的。

3.2 CDatabase类在VC中的应用第一步建立初始化MySQL对象,并且将其初始化。

即定义CDatabase类对象,这样程序就会自动调用构造函数CDatabase(),完成初始化。

构造函数实现如下:CDatabase::CDatabase (){mysql_init (&mysql);}完成初始化只需定义CDatabase类对象,即CDatabase base;第二步连接服务器,并连接需要的数据库。

即调用ConnectDB(Database_Param *p)函数,结构体Database_Param中存放数据库参数,包括主机名、用户名、密码、数据库名等。

该函数如返回TRUE表示连接成功,否则表示失败。

连接函数实现如下:BOOL CDatabase::ConnectDB(Database_Param *p){if(!mysql_real_connect(&mysql,p->host,p->user,p->password,p->db,p->po rt,p->unix_socket,p->client_flag)){OutErrors(); // 输出错误信息return false;}return true;}第三步对数据库进行加锁。

即调用LockTable(char* TableName,char* PRIORITY),对相应的表TableName完成相应属性PRIORITY的加锁,使程序兼容多线程功能。

加锁函数实现如下:BOOL CDatabase::LockTable(char* TableName,char* PRIORITY){char str[50];sprintf(str,"LOCK TABLES %s %s",TableName,PRIORITY);if(mysql_query(&mysql,str))return false;return true;}第四步完成数据库操作。

即根据需要调用UpdateRecord(Data_Param *para)、SelectRecord(Data_Param *para)、InsertRecord(Data_Param *para)、DelRecord(Data_Param *para)等操作。

其中的结构体Data_Param中存放数据库操作参数。

上述两个结构体的定义在global.h中。

InsertRecord函数实现如下,其它实现方法相似:BOOL CDatabase::InsertRecord(Data_Param *para){char str[80];sprintf(str,"insert into %svalues(%s)",para->tab_name,para->insert_val);if(mysql_query(&mysql,str))return false;return true;}第五步解锁数据库。

即调用UnLockTable(),完成对上述被加锁的表的解锁。

解锁函数实现如下:BOOL CDatabase::UnLockTable(){if(mysql_query(&mysql,"UNLOCK TABLES"))return false;return true;}第六步关闭数据库连接。

即调用析构函数~CDatabase(),关闭数据库,并自动释放初始化时定义的CDatabase类对象。

析构函数如下:CDatabase::~CDatabase(){if(query)mysql_free_result(query);mysql_close(&mysql);}注意:在编译程序时,必须加入MySQL的库文件libmySQL.lib。

4 MySQL性能测试4.1 ODBC API通过索引读取200万行:528秒插入35万行: 750秒4.2 C API通过索引读取200万行:412秒插入35万行:435秒4.3 其它数据库(以MS_SQL为例,WINNT环境)通过索引读取200万行:1634秒插入35万行:4012秒注:以上数据是多次测量的平均值,不可避免一定的误差,仅供参考。

5 结束语MySQL作为一个免费的SQL数据库,虽然功能不够十分强大,且灵活性较差,但是,已经能够满足一般应用软件的要求,而且MySQL 数据库的开发者也在力求使之更加完善。

并且,由MySQL性能测试可以看出,它对数据的处理速度明显快于其它数据库服务器。

因此,如果应用软件对数据库的性能要求较高,而同时对数据库操作的功能及灵活性的要求不是很高的话,并且前期投入资金较少时,MySQL数据库服务器不失为一个最佳的选择。

s。

相关文档
最新文档