对很多C/C++程序员来说,操作MySQL数据库是一个技术难点,本文讲述采用freecplus开源框架操作MySQL数据库,freecplus框架是C语言技术网作者二十年的技术积累,功能强大,简单易用。
一、源代码说明
freecplus是一个Linux系统下的C/C++开源框架,源代码请前往C语言技术网(www.freecplus.net)下载。
本文介绍的是freecplus框架中采用connection和sqlstatement类操作MySQL数据库。
类的声明文件是freecplus/db/mysql/_mysql.h。
类的定义文件是freecplus/db/mysql/_mysql.cpp。
示例程序位于freecplus/db/mysql目录中。
编译规则文件是freecplus/db/mysql/makefile。
二、概述
本文不会介绍MySQL数据库、SQL语言和C/C++的基础知识,您应该是一个职业的C/C++程序员,在阅读本文之前,您已经掌握了MySQL数据库和SQL语言的基础知识。
freecplus框架把MySQL提供的库函数封装成了connection和sqlstatement类,采用封装后的类操作MySQL数据库,代码简洁优雅,性能卓越。
接下来我先列出connection和sqlstatement类的声明,然后通过流程图和示例程序介绍它位的用法。
三、connection类
MySQL数据库连接connection类的声明(程序员不必关心的私有成员和数据结构未列出):
四、sqlstatement类
MySQL数据库的SQL语句操作sqlstatement类的声明(程序员不必关心的私有成员和数据结构未列出):
五、程序流程
freecplus框架把对MySQL数据库操作的SQL语句分为两种:有结果集的SQL语句和无结果集的SQL语句。
如果SQL语句被执行后,有结果集的产生,称为有结果集的SQL,即数据查询语言DQL,以select关键字,各种简单查询,连接查询等都属于DQL。
如果SQL语句被执行后,没有结果集的产生,称为无结果集的SQL,包括数据定义语言DDL(主要是create、drop和alter)和数据操纵语言DML(insert、update和insert)。
也可以这么说,查询的SQL语句会产生结果集,其它的SQL语句不会产生结果集。
1、无结果集SQL的程序的流程
这是一个完程的流程,在实际开发中,如果是执行简单的SQL语句,第6步和第7步可能不需要,如果SQL语句只执行一次,第7步和第8步之间的循环也不需要。
2、有结果集SQL的程序的流程
这是一个完程的流程,在实际开发中,如果是执行简单的查询语句,第6步、第7步和第8步可能不需要,如果结果集中最多只有一条记录,第10步和第11步之间的循环也不需要。
六、示例程序
1、创建超女信息表
示例(createtable.cpp)
运行效果
2、向超女表中插入5条记录
示例(inserttable.cpp)
运行效果
3、更新超女表中的记录
示例(updatetable.cpp)
运行效果
4、查询超女表中的记录
示例(selecttable.cpp)
运行效果
5、查询超女表中的记录数
示例(counttable.cpp)
运行效果
7、删除超女表中的记录
示例(deletetable.cpp)
运行效果
8、与Oracle的兼容性处理
在封装sqlstatement类的时候,为了与Oracle兼容,做了以下方面的处理:
1)在MySQL中,绑定输入和输出变量采用的是"?",Oracle采用的是":n"(n表示变量的序号),在sqlstatement的prepare方法中,把":n"替换成了"?"。
2)在MySQL中,字符串与日期的转换函数是str_to_date和date_format,Oracle的转换函数是to_date和to_char,在sqlstatement的prepare方法中,把to_date替换成str_to_date,把to_char替换成date_format。
3)MySQL有时间格式是"%Y-%m-%d %h:%i:%s",Oracle数据库是"yyyy-mm-dd hh24:mi:ss",在sqlstatement的prepare方法中,把"yyyy-mm-dd hh24:mi:ss"替换成"%Y-%m-%d %h:%i:%s"。目前,只对"%Y-%m-%d %h:%i:%s"和"%Y%m%d%h%i%s"两个格式做了替换,如果需要对更多的格式做替换,请修改sqlstatement的prepare方法中的源代码。
4)MySQL的sqlstatement类绑定输入或输出变量的最大数量缺省是256,在"_mysql.h"头文件中定义了MAXPARAMS宏,您可以根据实际需求修改它。
9、longtext和longblob字段的操作
MySQL提供的库函数支持对longtext和longblob字段的操作,本人的技术水平有限,找不到这方面的资料和示例程序,所以还没有封装对longtext和longblob字段的操作,希望各位能提供技术帮助,通过C语言技术网与我联系,我们共同完善freecplus框架,非常感谢。
七、应用经验
本文提供的示例程序看上去简单,实则很精妙,希望大家多多思考,慢慢体会。