zoukankan      html  css  js  c++  java
  • 我的C++数据库访问库 荣

    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 接下来:

    接下来的文章会描述临界区的实现,数据库访问代码的实现。
  • 相关阅读:
    jQuery serialize()方法无法获取表单数据
    gorm 零值不更新问题
    SpringCloud Nacos使用和配置,SpringCloud Nacos 服务注册中心配置使用
    Nacos longPolling error,Nacos1.4.1服务配置文件更新一次后报错
    Windows Mysql5.7安装和配置,Windows 安装多个Mysql
    SpringCloud Gateway使用和配置,SpringCloud Gateway predicates详细配置
    Windows RabbitMQ_3.8 安装和配置,Windows erlang下载
    SpringCloud Hystrix dashboard2.2.7使用和配置,SpringCloud Hystrix dashboard服务监控
    SpringCloud Hystrix使用和配置,SpringCloud Hystrix服务熔断降级
    SpringCloud OpenFeign使用和配置,Java OpenFeign 使用教程
  • 原文地址:https://www.cnblogs.com/admin11/p/2551965.html
Copyright © 2011-2022 走看看