【发布时间】:2018-04-27 12:54:37
【问题描述】:
如何在 Mysql 准备语句中使用std::shared_ptr?在这种情况下我应该知道什么要求吗?在这种情况下boost::shared_ptr 和std::shared_ptr 有什么区别吗?
【问题讨论】:
标签: c++ mysql boost prepared-statement shared-ptr
如何在 Mysql 准备语句中使用std::shared_ptr?在这种情况下我应该知道什么要求吗?在这种情况下boost::shared_ptr 和std::shared_ptr 有什么区别吗?
【问题讨论】:
标签: c++ mysql boost prepared-statement shared-ptr
您没有提供有关您实际使用的 MSQL API 函数的任何详细信息,因此此答案也是通用的。
如果您应该使用以下 API 函数创建和删除指针:
API_OBJ *api_obj_create( ... );
api_obj_delete(API_OBJ*);
要使用std::shared_ptr 管理您的指针,您需要提供自定义删除器:
std::shared_ptr<API_OBJ> my_s_ptr(api_obj_create( ... ),
[](API_OBJ* p) { api_obj_delete(p); });
标准库通常比 boost 库更受欢迎。
【讨论】:
标题
#include <boost/shared_ptr.hpp>
#include <string>
#include <vector>
#include <mysql_connection.h>
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>
sql::Driver *host_1_driver;
boost::shared_ptr <sql::Connection> host_1_conn;
boost::shared_ptr <sql::Statement> host_1_stmt;
boost::shared_ptr <sql::ResultSet> host_1_res;
boost::shared_ptr <sql::PreparedStatement> host_1_pstmt;
bool reconnect_state = true;
std::string host_1_name;
std::string host_1_user_name;
std::string host_1_password;
std::string host_1_database_name;
连接
host_1_driver = get_driver_instance (); // protected
host_1_conn.reset(host_1_driver->connect (host_1_name, host_1_user_name, host_1_password)); // connect to mysql
host_1_conn->setClientOption("OPT_RECONNECT", &reconnect_state);
host_1_conn->setSchema(host_1_database_name);
线程
void float_to_sql(std::string query, std::vector <float> data_to_write, std::vector <float> data_ids)
{
host_1_driver->threadInit(); // prevents multiple open connections
if (host_1_conn.get() == NULL)
{
ERROR << "host_1 connection is not open";
throw -1;
}
host_1_pstmt.reset (host_1_conn->prepareStatement (query));
for (int i = 0; i < (int) data_to_write.size(); i++)
{
host_1_pstmt->setDouble(1, data_to_write.at(i));
host_1_pstmt->setInt(2, data_ids.at(i));
host_1_pstmt->executeUpdate();
}
host_1_driver->threadEnd();
return;
}
测试
std::string query = "update ErrorCodes set Val = ? where ID = ?";
std::vector <float> data {1, 1, 1};
std::vector <float> data_ids {3, 5, 9};
float_to_sql(query, data, data_ids);
【讨论】: