惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
AWS News Blog
AWS News Blog
Google DeepMind News
Google DeepMind News
U
Unit 42
博客园 - 叶小钗
博客园 - 聂微东
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
D
DataBreaches.Net
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Jina AI
Jina AI
美团技术团队
The Cloudflare Blog
M
MIT News - Artificial intelligence
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
S
Schneier on Security
C
Check Point Blog
Project Zero
Project Zero
The Hacker News
The Hacker News
Scott Helme
Scott Helme
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Cisco Talos Blog
Cisco Talos Blog
P
Privacy International News Feed
SecWiki News
SecWiki News
Latest news
Latest news
MongoDB | Blog
MongoDB | Blog
S
Secure Thoughts
Google Online Security Blog
Google Online Security Blog
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
H
Help Net Security
TaoSecurity Blog
TaoSecurity Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Last Week in AI
Last Week in AI
P
Privacy & Cybersecurity Law Blog
Forbes - Security
Forbes - Security
G
GRAHAM CLULEY
N
Netflix TechBlog - Medium
L
Lohrmann on Cybersecurity
A
About on SuperTechFans
T
The Exploit Database - CXSecurity.com
C
Cisco Blogs
PCI Perspectives
PCI Perspectives
大猫的无限游戏
大猫的无限游戏
T
Troy Hunt's Blog
H
Hacker News: Front Page
Vercel News
Vercel News

博客园 - 荣-

学习实践:使用模式,原则实现一个C++自动化测试程序 学习实践:使用模式,原则实现一个C++数据库访问类 C++字符转换等常用方法 DLL内存管理模板类 字符串处理代码(国际化转换C++版) 我的C++数据库访问库--临界区处理类 批处理文件的学习 C++中,以类成员函数指针作为参数对std::map中的元素进行迭代处理 取得MySQL数据库表,列信息的SQL语句 我的我的C#数据库操作类(与大家交流) ACE项目的重构整理 安装SQL Server 2000和sp补丁时,安装程序提示"以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机"。 我的计算机安装步骤 创建oracle用户 我的重构步骤 我的C++代码检查列表 PowerDesigner高级应用 文档的阅读 如何设计类
我的C++数据库访问库
荣- · 2012-06-16 · via 博客园 - 荣-

1 概述

下面是我写的一个C++的数据库访问库,该库的目标是屏蔽掉繁琐的操作,以简单的接口,提供基本的访问数据库的功能。

2 主要接口

该库主要有如下接口:

Open:根据用户传入的连接字符串,打开数据库连接。

Close: 关闭已经打开的数据库连接。

ExecuteNoQuery:执行SQL语句(不需要返回结果的,例如添加、删除、编辑)

ExecuteScalar:执行SQL语句,返回第一行,第一列的数据。

ExecuteQuery:执行SQL查询,返回一个存储map的vector。

考虑到线程安全,还提供是否使用临界区的选择和数据库类型的选择(目前只支持MySQL)。

3 接口定义

该库位于His命名空间下,接口定义如下:

#pragma once

/**

* @defgroup 数据库操作类

* @brief 数据库操作类,封装数据库的通用操作。

*    @author 徐敏荣

* @date 2012-06-14

*

* @par 修订历史

* @version v0.5 \n

*    @author 徐敏荣

* @date 2012-06-14

* @li 初始版本

* @{

*/ 

#include "HisDBCommon.h"

namespace His

{

    class HisDBImpl;

    /**

    * @brief 数据库操作类,封装数据库的通用操作

    *

    */

    class HISCOMM_EXPORT HisDB

    {

    public:

        /**

        * @brief 构造函数

        *    @param[in] type            数据库类型

        *    @param[in] isUsingLock    是否需要使用互斥锁

        */

        HisDB(HisDBType type, bool isUsingLock);

        /**

        * @brief 析构函数

        */

        ~HisDB();

    public:

        /**

        * @brief 打开数据库连接

        *    @param[in] conn            数据库连接字符串

        * @retval true:成功,false;失败

        */

        bool Open(const char* conn);

        /**

        * @brief 关闭据库连接

        */

        void Close(void);

    public:

        /**

        * @brief 执行SQL语句,并不返回结果

        *    @param[in] conn            SQL语句

        * @retval true:成功,false;失败

        */

        bool ExecuteNoQuery(const char* sql, ...);

        /**

        * @brief 执行SQL语句,并不返回结果

        *    @param[in] sql            SQL语句

        *    @param[in] paramers        参数集合

        * @retval true:成功,false;失败

        * @note SQL语句中,参数以特殊字符?代替,例如...“column='sd'”...替换为...?...

        */

        bool ExecuteNoQuery(const char* sql, const vector<HisDBParamer>& paramers);

    public:

        /**

        * @brief 执行SQL语句,返回一个结果

        *    @param[in] sql            SQL语句

        *    @param[out] value        取得的结果

        * @retval true:成功,false;失败

        */

        bool ExecuteScalar(const char* sql, HisDBValue& value, ...);

        /**

        * @brief 执行SQL语句,返回一个结果(int)

        *    @param[in] sql            SQL语句

        *    @param[out] value        取得的结果

        * @retval true:成功,false;失败

        */

        bool ExecuteScalar(const char* sql, int& value, ...);

        /**

        * @brief 执行SQL语句,返回一个结果(string)

        *    @param[in] sql            SQL语句

        *    @param[out] value        取得的结果

        * @retval true:成功,false;失败

        */

        bool ExecuteScalar(const char* sql, string& value, ...);        

        /**

        * @brief 执行SQL语句,并不返回结果

        *    @param[in] sql            SQL语句

        *    @param[in] paramers        参数集合

        *    @param[out] value        取得的结果

        * @retval true:成功,false;失败

        * @note SQL语句中,参数以特殊字符?代替,例如...“column='sd'”...替换为...?...

        */

        bool ExecuteScalar(const char* sql, 

             const vector<HisDBParamer>& paramers, HisDBValue& value);                

        /**

        * @brief 执行SQL语句,并不返回结果(int)

        *    @param[in] sql            SQL语句

        *    @param[in] paramers        参数集合

        *    @param[out] value        取得的结果

        * @retval true:成功,false;失败

        * @note SQL语句中,参数以特殊字符?代替,例如...“column='sd'”...替换为...?...

        */

        bool ExecuteScalar(const char* sql, 

             const vector<HisDBParamer>& paramers, int& value);                

        /**

        * @brief 执行SQL语句,并不返回结果(string)

        *    @param[in] sql            SQL语句

        *    @param[in] paramers        参数集合

        *    @param[out] value        取得的结果

        * @retval true:成功,false;失败

        * @note SQL语句中,参数以特殊字符?代替,例如...“column='sd'”...替换为...?...

        */

        bool ExecuteScalar(const char* sql, 

             const vector<HisDBParamer>& paramers, string& value);

    public:

        /**

        * @brief 执行SQL语句,返回一个结果集合

        *    @param[in] sql            SQL语句

        *    @param[out] table        取得的结果集合

        * @retval true:成功,false;失败

        */

        bool ExecuteQuery(const char* sql, HisDBTable** table, ...);        

        /**

        * @brief 执行SQL语句,返回一个结果集合

        *    @param[in] sql            SQL语句

        *    @param[in] paramers        参数集合

        *    @param[out] table        取得的结果集合

        * @retval true:成功,false;失败

        * @note SQL语句中,参数以特殊字符?代替,例如...“column='sd'”...替换为...?...

        */

        bool ExecuteQuery(const char* sql, 

            HisDBTable** table, const vector<HisDBParamer>& paramers);

    public:    

        /**

        * @brief 向数据库中添加一条记录

        *    @param[in] tableName    数据库表名称

        *    @param[in] paramers        参数集合

        * @retval true:成功,false;失败

        * @note 自动根据表名、参数集合的中参数的名称,值,数据类型和是否为空组成SQL语句

        */

        bool Create(const char* tableName, const vector<HisDBParamer>& paramers);

        /**

        * @brief 执行SQL语句,返回一个结果集合

        *    @param[in] tableName    数据库表名称

        *    @param[in] paramers        参数集合

        * @retval true:成功,false;失败

        * @note 自动根据表名、参数集合的中参数的名称,值,数据类型和是否为空组成SQL语句

        */

        bool Delete(const char* tableName, const vector<HisDBParamer>& paramers);

    public:    

        /**

        * @brief 开启事物

        * @retval true:成功,false;失败

        */

        bool BeginTransaction(void);

        /**

        * @brief 提交事物

        * @retval true:成功,false;失败

        */

        bool CommitTransaction(void);

        /**

        * @brief 事物回滚

        * @retval true:成功,false;失败

        */

        bool RollbackTransaction(void);

    public:

        /**

        * @brief 释放查询集合资源

        *    @param[in] table    查询的集合资源

        * @retval true:成功,false;失败

        */

        bool ReleaseHisDBTable(HisDBTable* table);

    private:

        /**

        * @brief 数据库操作实现指针

        */

        HisDBImpl*    m_Impl;        /**< 数据库操作实现指针 */

    };

}

/**//** @}*/ // 数据库操作类

4 相关结构体定义

在接口定义中,使用到了很多自定义的结构体,这些结构体主要有三类:

  • HisDBParamer: SQ语句参数,用户提供SQL语句时,根据需要提供参数,该库会自动根据SQL语句和参数生成完整的SQL语句。例如:用户提供SQL语句“Select * FROM Table1 Where ID=1 AND ?”,提供一个类型为string,field为name,值为test的参数,则库会自动生成如下语句:“Select * FROM Table1 Where ID=1 AND name='test'”。
  • HisDBValue:存储查询结果中的一个值的结构体,属性包括该值是多少,类型是什么,field是什么等。
  • HisDBTable: 存储查询结果的数组,数组中的每个元素是一个map,map的键是field,值是该行,field列的数据对象(HisDBValue),HisDBTable暂时使用typedef定义,以后可以考虑使用类定义。

此外还有一个异常结构体HisDBException,指明异常的位置,描述,错误编号等信息。还为HisDBException提供一个宏HisDBHelperOnError,修改宏可以决定是否使用异常,如果不使用异常,则返回false。

除结构体外,还有数据库类型枚举HisDBType和数据类型HisDBDataType。

5 相关结构体代码

#pragma once

#include "../Common//HisExport.h"

#include <string>

#include <vector>

#include <map>

using namespace std;

namespace His

{

    /** @brief 数据库类型 */

    typedef enum _HisDBType

    {

        HisDBType_Invail,    /**< 无效类型 */

        HisDBType_MySQL,    /**< MySQL */

    }HisDBType;

    /** @brief 数据类型 */

    typedef enum _HisDBDataType

    {

        HisDBDataType_Invail,        /**< 无效类型 */

        HisDBDataType_Short,        /**< 短整数 */

        //HisDBDataType_Int,

        HisDBDataType_Long,            /**< 长整数 */

        HisDBDataType_LongLong,        /**< 64位整数 */

        //HisDBDataType_FLOAT,

        HisDBDataType_DOUBLE,        /**< 浮点数 */

        //HisDBDataType_DECIMAL,

        HisDBDataType_String,        /**< 字符串 */

        HisDBDataType_Date,            /**< 日期 */

        HisDBDataType_Time,            /**< 时间 */

        HisDBDataType_NULL,            /**< 空值 */

    }HisDBDataType;

    typedef struct _HisDBValue

    {

        string            m_Field;    

        string            m_Value;

        HisDBDataType    m_DataType;

        bool            m_IsNull;

    }HisDBValue;

    typedef struct _HisDBParamer

    {

        string            m_Name;

        string            m_Field;    

        string            m_Value;

        HisDBDataType    m_DataType;

        bool            m_IsNull;

        bool            m_IsEqual;

    }HisDBParamer;

#ifndef HisDBTable

    typedef vector<map<string,HisDBValue>> HisDBTable;

#endif

    typedef struct _HisDBException

    {

        string        m_sql;

        string        m_descript;

        string        m_position;

        long        m_errorId;

        HisDBType    m_dbTyp;

    }HisDBException;

}

//class HISCOMM_EXPORT HisDBTable

//{

//public:

//    HisDBVector m_Vector;

//};

#define HisDBHelperOnError(ps, script,sql, id) \

    His::HisDBException exception;\

    exception.m_position = ps;\

    exception.m_descript = script;\

    exception.m_sql = sql;\

    exception.m_errorId = id;\

    throw exception;\

    //return false;

注:HisDBParamer的m_Name属性是后加的,主要考虑一次操作有两个或多个field相同或field为t.column的情况。

6 接下来:

接下来的文章会描述临界区的实现,数据库访问代码的实现。