mysqlcppconn 之 ConnectOptionsMap 的使用
由来
继上一篇文章 http://www.voidcn.com/blog/Sidyhe/article/p-5724536.html , 发现之前写的一篇文章 http://www.voidcn.com/blog/Sidyhe/article/p-1645553.html 中断线重连部分是错误的, 也是现在翻阅了源码才知道
想要自动重连, 必须使用 ConnectOptionsMap 才可以
但由于官方代码没有做好导出部分的处理, 直接使用此类型会造成内存异常 (跨模块传递 STL 对象)
所以本人简单的添加了几个导出函数, 绕过了这个问题
添加代码
在 connection.h 中, 找到
typedef std::map<:sqlstring connectpropertyval> ConnectOptionsMap;
在下面紧接着添加CPPCONN_PUBLIC_FUNCConnectOptionsMap*ConnectOptionsMap_New();
CPPCONN_PUBLIC_FUNCvoidConnectOptionsMap_Delete(ConnectOptionsMap*obj);
CPPCONN_PUBLIC_FUNCvoidConnectOptionsMap_Set(ConnectOptionsMap*obj,constchar*k,constVariant&v);
在 mysql_connection.cpp 中, 文件最后, sql 的命名空间内, 即最后一个花括号内, 添加以下代码CPPCONN_PUBLIC_FUNCConnectOptionsMap*ConnectOptionsMap_New()
{
returnnewConnectOptionsMap;
}
CPPCONN_PUBLIC_FUNCvoidConnectOptionsMap_Delete(ConnectOptionsMap*obj){
deleteobj;
}
CPPCONN_PUBLIC_FUNCvoidConnectOptionsMap_Set(ConnectOptionsMap*obj,constchar*k,constVariant&v){
(*obj)[k]=v;
}
编译, 取出 dll 和 lib 文件, 搞定.
如何使用sql::Connection*CSqlWorker::NewSqlObject()
{
try
{
typedefdecltype(sql::ConnectOptionsMap_Delete)*TConnectOptionsMap_Deleter;
std::unique_ptr<:connectoptionsmap>Maps(sql::ConnectOptionsMap_New(),sql::ConnectOptionsMap_Delete);
sql::ConnectOptionsMap_Set(Maps.get(),"hostName",sql::Variant(sql::SQLString(m_host.c_str())));
sql::ConnectOptionsMap_Set(Maps.get(),"userName",sql::Variant(sql::SQLString(m_user.c_str())));
sql::ConnectOptionsMap_Set(Maps.get(),"password",sql::Variant(sql::SQLString(m_pass.c_str())));
sql::ConnectOptionsMap_Set(Maps.get(),"OPT_RECONNECT",sql::Variant(true));
sql::ConnectOptionsMap_Set(Maps.get(),"OPT_CHARSET_NAME",sql::Variant(sql::SQLString("utf8")));
returnm_driver->connect(*Maps.get());
}
catch(sql::SQLExceptione)
{
_ASSERT(0);
}
returnNULL;
}
更多参数及作用, 请参阅 mysql_connection.cpp 的 MySQL_Connection::init 函数
完结
是不是看起来比较麻烦?
但为了使用扩展功能 (动态链接情况下), 只好先这样了
若要避免这个问题, 只能使用静态连接, 且运行库一致, 才可以.
来源: http://www.bubuko.com/infodetail-2736680.html