原文转自:www.cnblogs.com/aicro
mysqlpp:: Connect类型主要负责连接事宜,这是在所有开始mysql操作之前必须进行的(这是句废话)。
该类型的主要的结果如下所示
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