【问题标题】:How can I use std::shared_ptr with the Mysql prepared statements?如何将 std::shared_ptr 与 Mysql 准备语句一起使用?
【发布时间】:2018-04-27 12:54:37
【问题描述】:

如何在 Mysql 准备语句中使用std::shared_ptr?在这种情况下我应该知道什么要求吗?在这种情况下boost::shared_ptrstd::shared_ptr 有什么区别吗?

【问题讨论】:

    标签: c++ mysql boost prepared-statement shared-ptr


    【解决方案1】:

    您没有提供有关您实际使用的 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 库更受欢迎。

    【讨论】:

      【解决方案2】:

      标题

      #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);
      

      【讨论】:

        猜你喜欢
        • 2016-12-17
        • 1970-01-01
        • 2017-07-31
        • 1970-01-01
        • 2015-06-21
        • 2021-10-11
        • 1970-01-01
        • 1970-01-01
        • 2013-04-01
        相关资源
        最近更新 更多