MySQL的C++封装

2023-10-30

最近的项目数据库管理系统从SQL SERVER2000迁移到了MySQL上来,之前基于ADO的连接方式连接上SQL SERVER,使用MySQL数据库管理系统之后,直接在MySQL的C语言的API上以面向对象的方式封装实现了数据库的创建,表的创建,数据库的读写操作快速搭建原型,目前没有添加连接池模块和事务处理。


源码托管在github上https://github.com/figot/MySQLWrapper

1.MySQL的特性

使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性。
支持AIX、BSDi、FreeBSD、HP-UX、Linux、Mac OS、Novell NetWare、NetBSD、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。
为多种編程语言提供了API。这些編程语言包括C、C++、C#、VB.NET、Delphi、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等。
支持多線程,充分利用CPU资源,支持多用户。
優化的SQL查询算法,有效地提高查询速度。
既能够作为一个单独的应用程序在客户端服务器网络环境中运行,也能够作为一个程序库而嵌入到其他的软件中。
提供多语言支持,常见的编码如中文的GB 2312、BIG5,日文的Shift JIS等都可以用作數據表名和數據列名。
提供TCP/IP、ODBC和JDBC等多种数据库连接途径。
提供用于管理、检查、优化数据库操作的管理工具。
可以处理拥有上千万条记录的大型数据库。

2.C++的API封装

用C++连接SQL有两种可直接使用的接口:MySQL Connector/C++和MySQL+ +,<1>MySQL Connector/C++是最新发布的MySQL连接器,由Sun Microsystems开发。MySQL connector为C++提供面向对象的编程接口(API)和连接MySQL Server的数据库驱动器与现存的driver不同,Connector/C++是JDBC API在C++中的实现。换句话说,Connector/C++ driver的接口主要是基于Java语言的JDBC API。Java数据库连接(JDBC)是Java连接各种数据库的业界标准。Connector/C++实现了JDBC 4.0的大部分规范。熟悉JDBC编程的C++程序开发者可以提高程序开发的效率。

<2>MySQL++是一个用C++封装了MySQL的C API的类库。它是建立标准C ++标准库(STL)之上,使处理数据库处理STL容器一样容易。此外,MySQL的++提供了让你避免最重复的工作,提供了原生C++接口。

3.MySQL的C++封装实现

在快速搭建原型的过程中,没有用到这两种连接方式,直接在MySQL C API上封装实现。

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #ifndef __MYSQL_INTERFACE_H__  
  2. #define __MYSQL_INTERFACE_H__  
  3.   
  4. #include "winsock.h"  
  5. #include <iostream>  
  6. #include <string>  
  7. #include "mysql.h"  
  8. #include <vector>  
  9. #include <string>  
  10.   
  11. #pragma comment(lib, "ws2_32.lib")  
  12. #pragma comment(lib, "libmysql.lib")  
  13. using namespace std;  
  14.   
  15. class MySQLInterface  
  16. {  
  17. public:    
  18.     MySQLInterface();  
  19.     virtual ~MySQLInterface();  
  20.   
  21.     bool connectMySQL(char* server, char* username, char* password, char* database,int port);  
  22.     bool createDatabase(std::string& dbname);  
  23.     bool createdbTable(const std::string& query);  
  24.   
  25.     void errorIntoMySQL();  
  26.     bool writeDataToDB(string queryStr);  
  27.     bool getDatafromDB(string queryStr, std::vector<std::vector<std::string> >& data);  
  28.     void closeMySQL();  
  29.   
  30. public:  
  31.     int errorNum;                    //错误代号  
  32.     const char* errorInfo;             //错误提示  
  33.   
  34. private:  
  35.     MYSQL mysqlInstance;                      //MySQL对象,必备的一个数据结构  
  36.     MYSQL_RES *result;                 //用于存放结果 建议用char* 数组将此结果转存  
  37. };  
  38.   
  39. #endif  


[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include "stdafx.h"  
  2. #include "MySQLInterface.h"  
  3.   
  4.   
  5. //构造函数 初始化各个变量和数据  
  6. MySQLInterface::MySQLInterface():  
  7.     errorNum(0),errorInfo("ok")  
  8. {  
  9.     mysql_library_init(0,NULL,NULL);  
  10.     mysql_init(&mysqlInstance);  
  11.     mysql_options(&mysqlInstance,MYSQL_SET_CHARSET_NAME,"gbk");  
  12. }  
  13.   
  14. MySQLInterface::~MySQLInterface()  
  15. {  
  16.   
  17. }  
  18.   
  19. //连接MySQL  
  20. bool MySQLInterface::connectMySQL(char* server, char* username, char* password, char* database,int port)  
  21. {  
  22.     if(mysql_real_connect(&mysqlInstance,server,username,password,database,port,0,0) != NULL)  
  23.         return true;  
  24.     else  
  25.         errorIntoMySQL();  
  26.     return false;  
  27. }  
  28. //判断数据库是否存在,不存在则创建数据库,并打开  
  29. bool MySQLInterface::createDatabase(std::string& dbname)  
  30. {  
  31.     std::string queryStr = "create database if not exists ";  
  32.     queryStr += dbname;  
  33.     if (0 == mysql_query(&mysqlInstance,queryStr.c_str()))  
  34.     {  
  35.         queryStr = "use ";  
  36.         queryStr += dbname;  
  37.         if (0 == mysql_query(&mysqlInstance,queryStr.c_str()))  
  38.         {  
  39.             return true;  
  40.         }  
  41.           
  42.     }  
  43.     errorIntoMySQL();  
  44.     return false;  
  45. }  
  46. //判断数据库中是否存在相应表,不存在则创建表  
  47. bool MySQLInterface::createdbTable(const std::string& query)  
  48. {  
  49.     if (0 == mysql_query(&mysqlInstance,query.c_str()))  
  50.     {  
  51.         return true;  
  52.     }  
  53.     errorIntoMySQL();  
  54.     return false;  
  55. }  
  56.   
  57. //写入数据  
  58. bool MySQLInterface::writeDataToDB(string queryStr)  
  59. {  
  60.     if(0==mysql_query(&mysqlInstance,queryStr.c_str()))  
  61.         return true;  
  62.     else  
  63.         errorIntoMySQL();  
  64.     return false;     
  65. }  
  66. //读取数据  
  67. bool MySQLInterface::getDatafromDB(string queryStr, std::vector<std::vector<std::string> >& data)  
  68. {  
  69.     if(0!=mysql_query(&mysqlInstance,queryStr.c_str()))  
  70.     {  
  71.         errorIntoMySQL();  
  72.         return false;  
  73.     }  
  74.   
  75.     result=mysql_store_result(&mysqlInstance);  
  76.   
  77.     int row=mysql_num_rows(result);  
  78.     int field=mysql_num_fields(result);  
  79.   
  80.     MYSQL_ROW line=NULL;  
  81.     line=mysql_fetch_row(result);  
  82.   
  83.     int j=0;  
  84.     std::string temp;  
  85.     while(NULL!=line)  
  86.     {     
  87.         std::vector<std::string> linedata;  
  88.         for(int i=0; i<field;i++)  
  89.         {  
  90.             if(line[i])  
  91.             {  
  92.                 temp = line[i];  
  93.                 linedata.push_back(temp);  
  94.             }  
  95.             else  
  96.             {  
  97.                 temp = "";  
  98.                 linedata.push_back(temp);  
  99.             }  
  100.         }  
  101.         line=mysql_fetch_row(result);  
  102.         data.push_back(linedata);  
  103.     }  
  104.     return true;  
  105. }  
  106.   
  107. //错误信息  
  108. void MySQLInterface::errorIntoMySQL()  
  109. {  
  110.     errorNum=mysql_errno(&mysqlInstance);  
  111.     errorInfo=mysql_error(&mysqlInstance);  
  112. }  
  113.   
  114. //断开连接  
  115. void MySQLInterface::closeMySQL()  
  116. {  
  117.     mysql_close(&mysqlInstance);  
  118. }  


FROM:  http://blog.csdn.net/figo829/article/details/22328693

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL的C++封装 的相关文章

  • 在 PHP 字符串中格式化 MySQL 代码

    是否有任何程序 IDE 可以在 PHP 字符串中格式化 MySQL 代码 例如 我使用 PHPStorm IDE 但它无法做到这一点 它对 PHP 和 MYSQL 执行此操作 但不适用于 php 字符串内的 MYSQL 我已准备好使用新的
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 在 MySQL 中存储表情符号的编码问题:如何使用 Prisma ORM 在 NodeJS 中定义字符排序规则?

    亲爱的 Nodejs 专家和数据库专家 我们在 MySQL 数据库中存储表情符号和其他特殊字符时遇到问题 我们使用 Prisma 得到一个错误 这是我们使用的 ORM 参数无法从排序规则 utf8 general ci 转换为 utf8mb
  • MySQL:计算日期/时间之间的差异 - 仅在周一至周五“工作周”期间

    我需要计算开始日期 时间和结束日期 时间之间的差异 但是 我只想在 5 天的工作周内执行此操作 不包括周六 周日 做这个的最好方式是什么 我的想法是 从日期开始 我必须获取星期几 如果是工作日 那么我将添加到累加器中 如果不是 那么我不会添
  • 从按日期时间排序的 MySQL 表中获取用户的最后一个条目

    我有一张看起来像这样的桌子 USERNAME DATA DATETIME Jhon text1 2010 06 01 16 29 43 Mike text2 2010 06 01 16 29 22 Silver text3 2010 05
  • 连接 Netbeans 和 MySQL 但出现大整数错误

    所以我正在尝试向我的 Netbeans 数据库 即 MySQL 添加新连接 但我遇到了大整数转换错误 有人可以帮助我吗 详细地 我右键单击现有的MySQL 服务器位于 localhost 3306 root 已断开连接 gt gt 选择co
  • 如何优化这个MySQL慢(非常慢)查询?

    我有一个 2 GB 的 mysql 表 包含 500k 行 我在没有负载的系统上运行以下查询 select from mytable where name in n1 n2 n3 n4 bunch more order by salary
  • Windows 8.1 升级后 Apache 无法工作 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 今天从 Windows 8 升级到 Windows 8 1 后 Apache 不再工作 我上次从 Windows 7 升级到 Window
  • 从另一台计算机访问 MYSQL

    我想开发一个java桌面应用程序 我想在其中设置服务器 这意味着我在这里使用mysql db 该数据库将仅存储在一台电脑上 其余所有用户都可以访问该数据库 所以 我听说了mysql远程连接 其中尝试了一些事情 这些措施如下 我的电脑已连接w
  • db:schema:load 与 db:migrate 使用 capistrano

    我有一个 Rails 应用程序 我正在将其移动到另一台服务器 我认为我应该使用 db schema load 来创建 mysql 数据库 因为这是推荐的 我的问题是我正在使用 capistrano 进行部署 并且它似乎默认为 rake db
  • 什么时候应该使用 C++ 而不是 SQL?

    我是一名 C 程序员 偶尔使用 MySQL 来处理数据库 但我的 SQL 知识相当有限 但我肯定愿意改变这一点 目前 我正在尝试仅使用 SQL 查询对数据库中的数据进行分析 但我准备放弃了 转而将数据导入到C 中 用C 代码进行分析 我和同
  • 无法在 Mac 上启动 MySQL

    使用 Brew 安装后 我无法运行 MySQL 我使用的是 OS X El Capitan 版本 10 11 3 和 MySQL Server 版本 5 7 11 当我启动服务器时 我收到 启动 MySQL 错误 服务器退出而不更新 PID
  • mysql 中的二进制、十六进制和八进制值

    我对在 mysql 数据库中使用二进制 十六进制和八进制系统非常感兴趣 首先 请给我一个建议 为什么我们在存储信息时需要它们 因为信息太多 或者为什么 另外 哪种类型的值必须存储在标记系统中 另外这里还有像 这是例子 gt SELECT 5
  • ORDER BY 字段内的 MySQL 子查询。 (没有内连接)

    有很多与此相关的问题 但都具有使用内部联接的相同答案 这 我认为 在这里是不可能的 如果我错了请告诉我 我现在正在做的是调用两个不同的 mysql 查询来获取结果 它工作完美 db gt query SELECT FROM meta WHE
  • MaxListenersExceededWarning:检测到可能的 EventEmitter 内存泄漏。添加了 11 条消息列表。使用emitter.setMaxListeners()来增加限制

    我知道这可能会标记为重复的解决方案 但堆栈溢出的解决方案对我不起作用 Problem node 5716 MaxListenersExceededWarning Possible EventEmitter memory leak detec
  • 获取带有计数的不同记录

    我有一张桌子personid and msg列 personid msg 1 msg1 2 msg2 2 msg3 3 msg4 1 msg2 我想得到总计msg对于每个personid 我正在尝试这个查询 select distinct
  • MySQL 与日语字符

    我试图弄清楚如何创建一个表 以便我可以在其中插入日语名字 现在我有 Type InnoDB Encoding UTF 8 Unicode utf8 Collation utf8 general ci 但是 当我插入字符时 它显示为 当我使用
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • SQL 最近日期

    我需要在 php 中获取诸如 2010 04 27 之类的日期作为字符串 并在表中找到最近的 5 个日期 表中的日期保存为日期类型 您可以使用DATEDIFF http dev mysql com doc refman 5 1 en dat

随机推荐

  • 【HTTP/1.1、HTTP/2、HTTP/3】

    文章目录 HTTP 1 1 如何优化 避免发送HTTP请求 减少HTTP次数 减少 HTTP 响应的数据大小 HTTP 2 HTTP 1 1性能问题 HTTP 2的性能优化 头部压缩 二进制帧 重点 并发传输 服务器主动推送资源 HTTP
  • 如何在IDEA中显示时序图

    如何在IDEA中显示时序图 有时候 我们想要了解代码的运行过程的时候 想要看到方法的调用流程 这个时候就希望有一个时序图可以看 但是人工来画时序图太麻烦了 有没有办法在IDEA中直接生成呢 当然是可以的 这里我们需要使用到Sequence
  • Python实现单例模式8种方法的优缺点比较

    Python实现单例 结论先行 为什么要使用单例模式 实例化过程原理 评价标准 一 使用类方法 getInstance 作为获取实例的接口 二 使用模块 同名实例替换类变量 三 使用函数装饰器 四 使用类装饰器 五 使用装饰器返回类 六 使
  • 微信小程序客服

    1 微信公众平台 功能 客服 微信客服 处 填写对应的企业ID 完成绑定 2 wx openCustomerServiceChat wx openCustomerServiceChat Object object 微信开放文档 qq com
  • 外观模式(Facade)

    摘录自 大话设计模式 外观模式 外观模式 Facade 为子系统中的一组接口提供一个一致的界面 此模式定义了一个高层接口 这个接口使得这一子系统更加容易使用 四个子系统的类 public class SubSystemOne public
  • Spring boot_公众号模板消息

    1 pom引入
  • 算法笔试题_2

    给定一个 N 进制正整数 把它的各位数字上数字倒过来排列组成一个新数 然后与原数相加 如果是回文数则停止 如果不是 则重复这个操作 直到和为回文数为止 如果 N 超过 10 使用英文字母来表示那些大于 9 的数码 例如对 16 进制数来说
  • 大数据技术与人工智能的关系

    结合了学习的知识和网上的相关资料 我个人觉得大数据与人工智能的关系如下 人工智能需要数据来建立其智能 特别是机器学习 大数据技术为人工智能提供了强大的存储能力和计算能力 如果说大数据相当于人的大脑存储了海量知识 而人工智能则是吸收了大量的数
  • the sip module implements API v12.0 to v12.8 but the PyQt5.QtGui module requires API v12.9

    问题描述 RuntimeError the sip module implements API v12 0 to v12 8 but the PyQt5 QtGui module requires API v12 9 分析原因 pyqt更新
  • Git Extension工具安装及使用

    以下界面所示的三个工具 如果没安装过 则勾上让其安装 MsysGit为Git的Windows版本 必须要安装 Kdiff为对比 合并工具 可选安装 可以换为使用其它的相关工具 最后一个Windows Credential Store for
  • java判断char是否相等

    在 Java 中可以使用 运算符来判断两个 char 类型的变量是否相等 例如 char c1 a char c2 b if c1 c2 System out println c1 is equal to c2 else System ou
  • 转:Python数据分箱,计算woe,iv

    转自 https zhuanlan zhihu com p 38440477 https www cnblogs com wzdLY p 9853209 html https github com Lucky Bone Discretiza
  • SQL语句的基本常用的一些语法

    1 ORDER BY 字段名 以 排序 如 select from A order by id desc 从大 gt 小 asc 从 小 gt 大 2 Group By 字段名 以 分组 select from A group by id
  • IOTDB-源码解析-查询

    单机查询流程 QueryPlan类 QueryPlan是有关查询相关的类 所有的plan都继承了PhysicalPlan这个虚类 QueryPlan也是一个虚类 其UML类图如下所示 IotDB中的各种reader 此章节请酌情参考查询基础
  • 白盒测试(基本路径法)代码

    白盒测试的一种常用方法是基本路径法 根据源代码构造程序流程图 转换为控制流图 得到基本路径 进而为每条基本路径设计测试用例 基本路径法的一个关键步骤是识别出所有的基本路径 本次作业要求你写一个C 程序 输入 待测程序的控制流图 输出 圈复杂
  • chisel环境安装

    step 0 把java装好 chisel依赖于java的 所以第一步你要装个java 去oracle官网去下载 下面网站 Java SE Development Kit 8 下载 www oracle com 如果你恰好家境贫寒 就下上面
  • 关于多项目使用Maven子工程无法使用

    前几天在网上找了一个商城的项目实战遇到一个问题 导入各种包但是Spring的核心配置文件还是全篇爆红 我自己记录一下我的解决方案 因为是多项目的问题 我当时创建文件的时候都把文件建在了Maven的parent目录下 所以无法导包进入 将每个
  • 【Unity基础】day1整理 -----小球吃金币

    小球 先搭一个场地Plane 命名Map 通过将四个墙的立方体归入Map 可以同时控制大小 分别赋予场地和墙的材质 创造一个小球Player 赋予材质和刚体 因为要实现键盘操作控制小球 因此需要写脚本挂载到Player上 using Sys
  • 基于粒子群算法的PID控制器优化设计(matlab实现)

    1 理论基础 PID控制器应用广泛 其一般形式为 可见 PID控制器的性能取决于Kp Ki Kd这3个参数是否合理 因此 优化PID控制器参数具有重要意义 目前 PID控制器参数主要是人工调整 这种方法不仅费时 而且不能保证获得最佳的性能
  • MySQL的C++封装

    最近的项目数据库管理系统从SQL SERVER2000迁移到了MySQL上来 之前基于ADO的连接方式连接上SQL SERVER 使用MySQL数据库管理系统之后 直接在MySQL的C语言的API上以面向对象的方式封装实现了数据库的创建 表