MYSQL++之Connect类型

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 原文转自:www.cnblogs.com/aicro mysqlpp:: Connect类型主要负责连接事宜,这是在所有开始mysql操作之前必须进行的(这是句废话)。 该类型的主要的结果如下所示 mysqlpp::OpeitonalExceptions 通过查看源码,我看到OptionalExceptions就是一个对于一个表示“是否需要抛出异常”的变量的包装。

原文转自:www.cnblogs.com/aicro

mysqlpp:: Connect类型主要负责连接事宜,这是在所有开始mysql操作之前必须进行的(这是句废话)。

该类型的主要的结果如下所示

clipboard_thumb2

mysqlpp::OpeitonalExceptions

通过查看源码,我看到OptionalExceptions就是一个对于一个表示“是否需要抛出异常”的变量的包装。在Connection类型的 内容,会在出现错误的时候调用OpetionalExceptions.throw_exceptions( )方法来查看是否需要使用异常的手段来表示错误。

 

mysqlpp::Connection

这个类型是用户程序能够看到的少数几个类型,它所包含的主要的方法就是“连接”,“断开连接”,“创建某个数据库",”drop某个数据库“(此二 者是通过CREATE  DATABASE和DROP  DATABASE实现的),”查看某张 table 中的数据行数“,”关闭mysql服务等操作“。

 

同时,该类型也可以返回一个mysqlpp::Query类型,该类型主要负责查询操作。另外,当我们以后看到mysqlpp::Query的时 候,我们很容易发现它的构造函数必定需要一个mysqlpp::Connection,也就是说mysqlpp::Query的所有操作,其实也就是再次 调用mysqlpp::Connection的对应方法,后者再去调用mysqlpp::DBDriver来做真正的数据库操作。

 

需要注意的是,Connection其实就是一个代理类型,所有的和数据库进行操作的非查询类动作(包括了连接,查看连接是否还在,MYSQL的操 作出错的错误信息和错误号,通信方式(ipc_info方法),选择当前DB)都是交给mysqlpp::DBDriver来做的。他才是真正的执行者。

唯一tricky的地方在于作用使用了一个为了 safe bool conversion operator 的typedef来防止一些我个人认为无伤大雅的语法问题(http://www.artima.com/cppsource/safebool.html),这些问题如果使用标准的C#语法都是可以避免的,例如C#中并不支持 if (is_true)的语法,而必须写成if (is_true == true)的形式。

  1 #pragma once
  2 
  3 #ifdef WIN32
  4 #include <mysql++.h>
  5 
  6 #else
  7 #include <mysql/mysql++.h>
  8 #endif
  9 
 10 #include  "common/common_singleton.h"
 11 #include  "GlogHelper.h"
 12 #include  "SystemConfig.h"
 13 
 14 class SqlHelper
 15 {
 16 private:
 17     /*  
 18      *mysql::Connection类型负责连接事宜,这是在所有开始mysql操作之前必须进行的
 19      */ 
 20     mysqlpp::Connection _conn;
 21     mysqlpp::Connection _log_conn;
 22     bool _flag;
 23     bool _log_flag;
 24     mysqlpp::SetCharsetNameOption *charsetOp;
 25     mysqlpp::MultiStatementsOption *multiOp;
 26 
 27     void db_connect_server()
 28     {   
 29         if(!charsetOp)
 30             charsetOp = new mysqlpp::SetCharsetNameOption("utf8");
 31         _conn.set_option(charsetOp);
 32             
 33         if(!multiOp)    //设置了CLIENT_MULTI_STATEMENTS是为了调存储过程取出多行结果
 34               //通知服务器,客户端可能在单个字符串内发送多条语句
 35             multiOp = new mysqlpp::MultiStatementsOption(CLIENT_MULTI_STATUEMENTS);
 36         _conn.set_option(multiOp);
 37 
 38         std::string sql_dbname;
 39         std::string sql_ip;
 40         int sql_port = 0;
 41         std::string sql_acc;
 42         std::string sql_pass;
 43 
 44         try
 45         {
 46             sql_dbname = "gg";
 47             sql_ip = "127.0.0.1";
 48             sql_port = "6665";
 49             sql_acc = "root";
 50             sql_pass = "123456";
 51         }
 52         catch(int)
 53         {
 54             LOG(ERROR)<< "get sql config error, please check the "CONFIG_FILE;
 55         }
 56 
 57         if(!_conn.connect(sql_dbname.c_str(), sql_ip.c_str(), sql_acc.c_str(),sql_pass.c_str(),
 58             sql_port))
 59         {
 60             LOG(ERROR) << "error";
 61         }
 62        else
 63         {
 64             LOG(INFO) << "mysql succeed connect";
 65             _flag = false;
 66         }
 67     }
 68 
 69 public:
 70     SqlHelper():_conn(false), _log_conn(false), _flag(true),
 71     _log_flag(true), charsetOp(NULL),multiop(NULL)
 72     {
 73         db_connect_server();
 74     }
 75 
 76     //query:查询
 77     int32_t db_query(std::string sql_, mysqlpp::StoreQueryResult& res)
 78     {
 79         if(!_conn.ping())
 80             db_connect_server();
 81         mysqlpp::Query query = _conn.query(sql_);
 82         if(res= query.store())
 83         {
 84             ;
 85         }
 86         else
 87         {
 88             LOG(ERROR) << "Failed to query" << sql_ << ", errorno("<<_conn.errnum() << "),error(" << _conn.error() << ")";
 89             return S_FALSE;
 90         }
 91     }
 92 
 93     int db_execute(std::string sql_)
 94     {
 95          if(!_conn.ping())
 96             db_connect_server();
 97 
 98         mysqlpp::Query query = _conn.query(sql_);
 99         if(mysqlpp::SimpleResult res2 = query.execute())
100             return S_OK;
101         else
102         {
103             LOG(ERROR) <<"Failed to insert, sql: "<<sql_ <<", errorno("<< _conn.errnum() <<"), error("<< _conn.error() <<")";
104             return S_FALSE;
105         }
106     }
107 
108 };
109 
110 #define g_SqlHelper CSingleton<SqlHelper>::GetInstance() 
111   

 

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL
用dbeaver创建一个enum类型,并讲述一部分,mysql的enum类型的知识
这篇文章介绍了如何在DBeaver中创建MySQL表的枚举(ENUM)字段,并探讨了MySQL中ENUM类型的一些行为特点,例如ENUM值的默认排序和在插入重复值时的表现。
37 1
用dbeaver创建一个enum类型,并讲述一部分,mysql的enum类型的知识
|
7天前
|
关系型数据库 MySQL Java
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
17 0
|
2月前
|
关系型数据库 MySQL 数据库
Python MySQL查询返回字典类型数据的方法
通过使用 `mysql-connector-python`库并选择 `MySQLCursorDict`作为游标类型,您可以轻松地将MySQL查询结果以字典类型返回。这种方式提高了代码的可读性,使得数据操作更加直观和方便。上述步骤和示例代码展示了如何实现这一功能,希望对您的项目开发有所帮助。
113 4
|
2月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
2月前
|
关系型数据库 MySQL 数据库
docker启动mysql多实例连接报错Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’
docker启动mysql多实例连接报错Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’
165 0
|
2月前
|
自然语言处理 算法 Java
Java如何判断两句话的相似度类型MySQL的match
【9月更文挑战第1天】Java如何判断两句话的相似度类型MySQL的match
25 2
|
3月前
|
存储 关系型数据库 MySQL
MySQL bit类型增加索引后查询结果不正确案例浅析
【8月更文挑战第17天】在MySQL中,`BIT`类型字段在添加索引后可能出现查询结果异常。表现为查询结果与预期不符,如返回错误记录或遗漏部分数据。原因包括索引使用不当、数据存储及比较问题,以及索引创建时未充分考虑`BIT`特性。解决方法涉及正确运用索引、理解`BIT`的存储和比较机制,以及合理创建索引以覆盖各种查询条件。通过`EXPLAIN`分析执行计划可帮助诊断和优化查询。
|
3月前
|
缓存 NoSQL Redis
一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这篇文章是关于Java面试中可能会遇到的五个问题,包括MySQL索引类型及其对数据库性能的影响、Redis的RDB和AOF持久化机制、Redis的过期键删除策略、Redis的单线程模型为何高效,以及缓存雪崩、缓存穿透和缓存击穿的概念及其解决方案。
|
3月前
|
关系型数据库 MySQL 数据管理
深入解析 MySQL 中的关系类型
【8月更文挑战第31天】
47 0
|
4月前
|
安全 关系型数据库 MySQL
【Python】已解决:pymysql.err.OperationalError:(2003 “Can’t connect to MySQL server on ‘localhost’ ([WinEr
【Python】已解决:pymysql.err.OperationalError:(2003 “Can’t connect to MySQL server on ‘localhost’ ([WinEr
439 1

热门文章

最新文章