原文转自: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)的形式。

 #pragma once

 #ifdef WIN32
#include <mysql++.h> #else
#include <mysql/mysql++.h>
#endif #include "common/common_singleton.h"
#include "GlogHelper.h"
#include "SystemConfig.h" class SqlHelper
{
private:
/*
*mysql::Connection类型负责连接事宜,这是在所有开始mysql操作之前必须进行的
*/
mysqlpp::Connection _conn;
mysqlpp::Connection _log_conn;
bool _flag;
bool _log_flag;
mysqlpp::SetCharsetNameOption *charsetOp;
mysqlpp::MultiStatementsOption *multiOp; void db_connect_server()
{
if(!charsetOp)
charsetOp = new mysqlpp::SetCharsetNameOption("utf8");
_conn.set_option(charsetOp); if(!multiOp) //设置了CLIENT_MULTI_STATEMENTS是为了调存储过程取出多行结果
//通知服务器,客户端可能在单个字符串内发送多条语句
multiOp = new mysqlpp::MultiStatementsOption(CLIENT_MULTI_STATUEMENTS);
_conn.set_option(multiOp); std::string sql_dbname;
std::string sql_ip;
int sql_port = ;
std::string sql_acc;
std::string sql_pass; try
{
sql_dbname = "gg";
sql_ip = "127.0.0.1";
sql_port = "";
sql_acc = "root";
sql_pass = "";
}
catch(int)
{
LOG(ERROR)<< "get sql config error, please check the "CONFIG_FILE;
} if(!_conn.connect(sql_dbname.c_str(), sql_ip.c_str(), sql_acc.c_str(),sql_pass.c_str(),
sql_port))
{
LOG(ERROR) << "error";
}
else
{
LOG(INFO) << "mysql succeed connect";
_flag = false;
}
} public:
SqlHelper():_conn(false), _log_conn(false), _flag(true),
_log_flag(true), charsetOp(NULL),multiop(NULL)
{
db_connect_server();
} //query:查询
int32_t db_query(std::string sql_, mysqlpp::StoreQueryResult& res)
{
if(!_conn.ping())
db_connect_server();
mysqlpp::Query query = _conn.query(sql_);
if(res= query.store())
{
;
}
else
{
LOG(ERROR) << "Failed to query" << sql_ << ", errorno("<<_conn.errnum() << "),error(" << _conn.error() << ")";
return S_FALSE;
}
} int db_execute(std::string sql_)
{
if(!_conn.ping())
db_connect_server(); mysqlpp::Query query = _conn.query(sql_);
if(mysqlpp::SimpleResult res2 = query.execute())
return S_OK;
else
{
LOG(ERROR) <<"Failed to insert, sql: "<<sql_ <<", errorno("<< _conn.errnum() <<"), error("<< _conn.error() <<")";
return S_FALSE;
}
} }; #define g_SqlHelper CSingleton<SqlHelper>::GetInstance()

MYSQL++之Connect类型的更多相关文章

  1. 【原创】2. MYSQL++之Connect类型

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

  2. 解决python写入mysql中datetime类型遇到的问题

    解决python写入mysql中datetime类型遇到的问题 刚开始使用python,还不太熟练,遇到一个datetime数据类型的问题: 在mysql数据库中,有一个datetime类型的字段用于 ...

  3. mysql中boolean类型

      MYSQL保存BOOLEAN值时用1代表TRUE,0代表FALSE,boolean在MySQL里的类型为tinyint(1), MySQL里有四个常量:true,false,TRUE,FALSE, ...

  4. MYSQL中 ENUM 类型

    MYSQL中 ENUM 类型的详细解释 ENUM类型 ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举. 在下列某些情况下,值也可以是空串(&quo ...

  5. 如何正确选择MySQL数据列类型

    MySQL数据列类型选择是在我们设计表的时候经常会遇到的问题,下面就教您如何正确选择MySQL数据列类型,供您参考学习. 选择正确的数据列类型能大大提高数据库的性能和使数据库具有高扩展性.在选择MyS ...

  6. mysql的text类型长度问题

    在我的概念中,mysql中的text字段应该是没有长度限制的,但是今天事实告诉我,text类型的长度是有限制的.其中mysql的text类型有64K长度限制的,MEDIUMTEXT中型是2G,LONG ...

  7. mysql的point类型查询处理

    mysql的point类型,很蛋疼的表示更习惯于key—value的lng,lat 假设不得不处理数据库字段poi是point类型,其中的数据为 : POINT(28.2789745229671 11 ...

  8. MySQL常见错误类型

    MySQL常见错误类型:1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010: ...

  9. MySQL 常用字段类型,介绍及其建表使用方法经验分享

    由于工作的公司没有专业的DBA又经常需要建立各种各种的表来满足自己的业务逻辑,所以经常查看MySQL 手册或者谷歌查看相关资料,所以本人就根据我的工作经验和相关资料来介绍一下MySQL各种字段类型及其 ...

随机推荐

  1. 用OxyPlot在WPF中演示正演磁异常的变化规律

    为了在展示实验成果时动态演示理论球体磁异常随其埋深.磁化倾角的变化规律,我用WPF写了一个小程序来作演示. MatLab计算磁异常数据 首先是计算理论球体磁异常数据,在Matlab中可以很方便地计算. ...

  2. J2SE知识点摘记(十五)

    1.        字节流和字符流的转换 以字符为导向的stream基本上有与之相对应的以字节为导向的Stream,两个对应类实现的功能相同,只是操作时的导向不同 字节输入流转换为字符输入流: Inp ...

  3. 简易对象垃圾回收框架 for Delphi

    (一).缘起 1.1 我的一个出错程序 程序名称:呼叫处理模块的压力测试工具,分为客户端和服务端. 开发工具:Delhpi 5 相关技术:客户端通过与服务端建立Socket连接来模拟一组电话机的拨入. ...

  4. POJ 2799 IP Networks

    network address是前(32-n)随意 后n位全零 network mask是前(32-n)全一 后n位全零 本题主要利用位移操作,1ULL表示无符号长整型的常数1,这样写可防止不必要的溢 ...

  5. 适配器模式—STL中的适配器模式分析

    适配器模式通常用于将一个类的接口转换为客户需要的另外一个接口,通过使用Adapter模式能够使得原本接口不兼容而不能一起工作的类可以一起工作. 这里将通过分析c++的标准模板库(STL)中的适配器来学 ...

  6. Div实现滚动条效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 更新cydia“sub-process/usr/libexec/cydia/cydo returned anerror code(2)”是怎么回事?

    最近更新cydia的时候出现了sub-process/usr/libexec/cydia/cydo returned anerror code(2)的红字是怎么回事? 解决方法:删掉有关升级的东西,把 ...

  8. Java基础之"=="和 和 equals 方法的区别

    一."=="操作符 ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作 ...

  9. 利用Console来调试JS程序、Console用法总结

    http://blog.163.com/zhangmihuo_2007/blog/static/27011075201452522824347/ http://blog.163.com/zhangmi ...

  10. nodejs安装指定版本

    由于express有各种不同的版本,不同的版本开发方式有所不同,如果想安装指定版本可以选择全局安装指定版本: 安装步骤如下: (1) 安装2.5.8版本的express的方法: C:\Users\Li ...