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

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

​​MYSQL++之Connect类型_sql​​

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