MySQL的C++封装

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

  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上封装实现。

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

#ifndef __MYSQL_INTERFACE_H__
#define __MYSQL_INTERFACE_H__
 
#include "winsock.h"
#include <iostream>
#include <string>
#include "mysql.h"
#include <vector>
#include <string>
 
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "libmysql.lib")
using namespace std;
 
class MySQLInterface
{
public: 
    MySQLInterface();
    virtual ~MySQLInterface();
 
    bool connectMySQL(char* server, char* username, char* password, char* database,int port);
    bool createDatabase(std::string& dbname);
    bool createdbTable(const std::string& query);
 
    void errorIntoMySQL();
    bool writeDataToDB(string queryStr);
    bool getDatafromDB(string queryStr, std::vector<std::vector<std::string> >& data);
    void closeMySQL();
 
public:
    int errorNum;                    //错误代号
    const char* errorInfo;             //错误提示
 
private:
    MYSQL mysqlInstance;                      //MySQL对象,必备的一个数据结构
    MYSQL_RES *result;                 //用于存放结果 建议用char* 数组将此结果转存
};
 
#endif

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118

#include "stdafx.h"
#include "MySQLInterface.h"
 
 
//构造函数 初始化各个变量和数据
MySQLInterface::MySQLInterface():
    errorNum(0),errorInfo("ok")
{
    mysql_library_init(0,NULL,NULL);
    mysql_init(&mysqlInstance);
    mysql_options(&mysqlInstance,MYSQL_SET_CHARSET_NAME,"gbk");
}
 
MySQLInterface::~MySQLInterface()
{
 
}
 
//连接MySQL
bool MySQLInterface::connectMySQL(char* server, char* username, char* password, char* database,int port)
{
    if(mysql_real_connect(&mysqlInstance,server,username,password,database,port,0,0) != NULL)
        return true;
    else
        errorIntoMySQL();
    return false;
}
//判断数据库是否存在,不存在则创建数据库,并打开
bool MySQLInterface::createDatabase(std::string& dbname)
{
    std::string queryStr = "create database if not exists ";
    queryStr += dbname;
    if (0 == mysql_query(&mysqlInstance,queryStr.c_str()))
    {
        queryStr = "use ";
        queryStr += dbname;
        if (0 == mysql_query(&mysqlInstance,queryStr.c_str()))
        {
            return true;
        }
         
    }
    errorIntoMySQL();
    return false;
}
//判断数据库中是否存在相应表,不存在则创建表
bool MySQLInterface::createdbTable(const std::string& query)
{
    if (0 == mysql_query(&mysqlInstance,query.c_str()))
    {
        return true;
    }
    errorIntoMySQL();
    return false;
}
 
//写入数据
bool MySQLInterface::writeDataToDB(string queryStr)
{
    if(0==mysql_query(&mysqlInstance,queryStr.c_str()))
        return true;
    else
        errorIntoMySQL();
    return false;  
}
//读取数据
bool MySQLInterface::getDatafromDB(string queryStr, std::vector<std::vector<std::string> >& data)
{
    if(0!=mysql_query(&mysqlInstance,queryStr.c_str()))
    {
        errorIntoMySQL();
        return false;
    }
 
    result=mysql_store_result(&mysqlInstance);
 
    int row=mysql_num_rows(result);
    int field=mysql_num_fields(result);
 
    MYSQL_ROW line=NULL;
    line=mysql_fetch_row(result);
 
    int j=0;
    std::string temp;
    while(NULL!=line)
    {  
        std::vector<std::string> linedata;
        for(int i=0; i<field;i++)
        {
            if(line[i])
            {
                temp = line[i];
                linedata.push_back(temp);
            }
            else
            {
                temp = "";
                linedata.push_back(temp);
            }
        }
        line=mysql_fetch_row(result);
        data.push_back(linedata);
    }
    return true;
}
 
//错误信息
void MySQLInterface::errorIntoMySQL()
{
    errorNum=mysql_errno(&mysqlInstance);
    errorInfo=mysql_error(&mysqlInstance);
}
 
//断开连接
void MySQLInterface::closeMySQL()
{
    mysql_close(&mysqlInstance);
}

时间: 2024-09-13 21:28:44

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

Zebra_Database v2.3发布 面向对象MySQL数据库操作封装

Zebra_Database是一个高级,紧凑(只有一个文件),轻量级,面向对象的MySQL数据库操作封装.基于PHP的MySQL扩展.它提供http://www.aliyun.com/zixun/aggregation/11872.html">访问数据库的方法比PHP默认更加简单和直观.此外,它还提供调试控制台来查看SQL的执行情况. Zebra_Database it is an advanced, compact (one-file only), lightweight, object

Zebra_Database v2.2发布 面向对象MySQL数据库操作封装

Zebra_Database是一个高级,紧凑(只有一个文件),轻量级,面向对象的MySQL数据库操作封装.基于PHP的 MySQL扩展.它提供http://www.aliyun.com/zixun/aggregation/11872.html">访问数据库的方法比PHP默认更加简单和直观.此外,它还提供调试控制台来查看SQL的执行情况.提供了各种用于与 MySQL 数据库交互的直观方法,比 PHP 自带的更有趣. Zebra_Database it is an advanced, comp

数据库-新人自学PHPmysql和mysqli对封装工具类的疑问

问题描述 新人自学PHPmysql和mysqli对封装工具类的疑问 学习php过程中发现 看着视频学的封装数据库工具类发现用的全是面像过程的方法 而调用的时候和直接用mysqli差不多感觉还没有直接用mysqli来的方便快捷 这样的话直接用mysqli还需要用mysql工具类封装吗? 解决方案 封装是为了复用,不了为封装而封装.开始的时候直接用,当你感觉代码有重复或者是抽象出一个工具类可以让代码更加简洁的时候,试着封装成工具类就 好.学习的时候的封装更多是为了教学. 解决方案二: php中关于m

mysql储存函过程和储存函数都属于存储程序

优点: v 提高安全性 v 简化mysql查询 v 减轻带宽负担 缺点: v 增加服务器负担 v 对我们开发者来说,难度大一点 PHP中的函数 Function funname(参数){ //函数体 Return  } 对于mysql,如果有返回值的存储程序,我们就称其为存储函数, 没有返回值的存储程序,我们就称其为存储过程. 下面主要是按存储过程来讲解 1.0快速案例:    delimiter $ //代码块 end $ #调用存储过程  call show_times(); #查看存储过程

MySQL源代码:从SQL语句到MySQL内部对象

0 写在前面 本文解决了什么问题:希望通过这些文章能够帮你更加顺畅的理解MySQL优化器的行为:在你阅读MySQL源代码之前了解更多的背后思路. 本文不解决什么问题:教你如何读懂源代码: 这个系列很长,大概按这样的思路进行下去: 基本的数据结构.语法解析.JOIN的主要算法.JOIN顺序和单表访问.数据结构(以及他们的关系)和算法流程总是相互穿插介绍. 建议阅读:参考文献中的文章和书籍,都建议在阅读本文之前阅读. 1 SQL语句解析基础 1.1 语法解析基础/Flex与Bison MySQL语法

Mysql 的存储过程和存储函数

优点: v 提高安全性 v 简化mysql查询 v 减轻带宽负担 缺点: v 增加服务器负担 v 对我们开发者来说,难度大一点 PHP中的函数 Function funname(参数){ //函数体 Return } 对于mysql,如果有返回值的存储程序,我们就称其为存储函数, 没有返回值的存储程序,我们就称其为存储过程. 下面主要是按存储过程来讲解 1.0快速案例: delimiter $ //代码块 end $ #调用存储过程 call show_times(); #查看存储过程 show

中国php新动力,Jwork框架即将发表

歌道"最近比较烦",我云"最近比较忙",但无论烦与忙,都不能阻止我对技术的追求,亦不能打断我要做中国开源事业的脚步. 作为我提出已久的jwork框架,终于,于2007年未,形成了php第一版. Jwork框架分为三种语言:Java版.Net版PHP版 目前,java和.net版处于研发阶段.php版jwork v1.0 for php初步计划于2008年2月1日正式开源. Jwork框架的特点:1.和其它框架相比,Jwork框架不需配置,不改变原有开发习惯.2.Jw

Mysql对文件操作的封装

mysql|封装 Mysql对文件操作的封装 在查看Mysql对文件的操作中发现,它在不同的操作系统上对文件的操作,除了使用标准C运行库函数,包括open.close.seek等,在Win32下的文件和目录操作函数使用了CreatFile.CloseHandl.SetFilePointer等,不明白为什么对文件的操作要封装出两套函数. 查看了相关资料,其实使用API和标准库函数都可以生成文本文件和二进制文件,在这点上没有区别.同read()对应的是ReadFile,同write()对应的是Wri

MYSQL的操作类(已封装)

class MySQLDB { //MYSQL数据库操作类 //作者:熊毅 //版本:2.0(发行版) //可以自由转载,修改请通知我scxy78@yeah.net //转载请保留以上声明 //使用说明: //该类完全按照ADO的习惯书写的,用过ASP的人都觉得ASP连接数据库比PHP好用(这是我的感觉), //但PHP得一个一个API地写,挺累,该类做了完全的封装 //创建类的实例时可以指定一个数据库表和选择的数据库,如:new MySQLDB("table","datab