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   
  • 相关阅读:
    e621. Activating a Keystroke When Any Child Component Has Focus
    e587. Filling Basic Shapes
    e591. Drawing Simple Text
    e595. Drawing an Image
    e586. Drawing Simple Shapes
    e636. Listening to All Key Events Before Delivery to Focused Component
    在 PL/SQL 块的哪部分可以对初始变量赋予新值? (选择1项)
    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
    你判断下面语句,有什么作用?(单选)
    Oracle数据库表空间与数据文件的关系描述正确的是( )
  • 原文地址:https://www.cnblogs.com/chris-cp/p/3687107.html
Copyright © 2011-2022 走看看