zoukankan      html  css  js  c++  java
  • MYSQL++之Connect类型

    原文转自: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   
  • 相关阅读:
    0diff算法参考资料
    js 对象属性值
    一些带有设计模式的优秀代码
    vue 配置多页面
    cms 管理系统
    网络技术:EtherChannel 链路汇聚
    网络技术:VLAN 中继协议(VTP)
    网络管理:管理信息库
    网络管理:抽象语法表示 ASN.1
    网络管理:基本编码规则(BER)
  • 原文地址:https://www.cnblogs.com/chris-cp/p/3687107.html
Copyright © 2011-2022 走看看