【问题标题】:How can I bind NULL value in libpq with C++?如何将 libpq 中的 NULL 值与 C++ 绑定?
【发布时间】:2019-04-30 09:11:10
【问题描述】:

我无法将 C++ 中数字类型的 NULL 值与 libpq 库绑定。 我使用这个描述 How to prepare statements and bind parameters in Postgresql for C++ 并且效果很好。

但我不知道如何为数字类型绑定 NULL 值。

 pqxx::prepare::invocation& prep_dynamic(std::vector<std::string>& data, pqxx::prepare::invocation& inv) 
{ 
    std::vector<std::string>::const_iterator it; 
    for(it=data.begin();it!=data.end();it++) 
    { 
        inv((*it)); 
    } 
    return inv; 
}





try 
     {
        pqxx::connection C("dbname = postgres user = postgres password=postgres hostaddr = 127.0.0.1 port = 5432");
        if (C.is_open()) 
        {
            std::string dbname = C.dbname();
            DIAG(DETAILED_INFO, "Opened database successfully:[%s]", dbname.c_str());           
        } 
        else 
        {
           DIAG(DETAILED_INFO, "Can't open database!");       
        }

        work W(C);

        C.prepare("example", "insert into ipls_troubleticketerrorreport (CUSTOMER, NETWORK,SELECTABLEMONTH, ERRORCODE,ERRORMESSAGE, TTID ) " \
                             "values ($1, $2, to_date($3,'YYYY-MM-DD'), $4, $5, $6);"); 


        pqxx::prepare::invocation w_invocation = W.prepared("example");


        std::vector< std::pair<std::string,std::string> > sqlParameters2;
        sqlParameters2.push_back(std::pair<std::string, std::string>("CUSTOMER", ""));
        sqlParameters2.push_back(std::pair<std::string, std::string>("NETWORK", ""));
        sqlParameters2.push_back(std::pair<std::string, std::string>("SELECTABLEMONTH", ""));
        sqlParameters2.push_back(std::pair<std::string, std::string>("ERRORCODE",""));
        sqlParameters2.push_back(std::pair<std::string, std::string>("ERRORMESSAGE", ""));
        sqlParameters2.push_back(std::pair<std::string, std::string>("TTID",""));


       for (int i = 0; i < sqlParameters2.size(); i++)
       {
            std::string value = "";                   
            value = i_get(sqlParameters2[i].first.c_str());            
            sqlParameters2[i].second = value;                         
       }

       std::vector<std::string > vect;

       for(int i=0; i<sqlParameters2.size();i++)
       {
           vect.push_back(sqlParameters2[i].second);

       }           

       prep_dynamic(vect, w_invocation);
       pqxx::result r = w_invocation.exec();
       W.commit();
      C.disconnect ();
     }
    catch(const std::exception &e)
    {
       DIAG(DETAILED_INFO, "exception occured.[%s]",e.what());   
       throw e;


    }

【问题讨论】:

  • 如果您尝试这样做,您的代码是什么?不需要NULL 值需要使用IS NULL 而不是= 运算符进行检查?
  • 这个答案应该对你有帮助:stackoverflow.com/a/21575201/1734130
  • 感谢您的回答,但是当我使用 prep_dyamic pqxx::prepare::invocation& prep_dynamic(std::vector<:string>& data, pqxx::prepare: :invocation& inv) { std::vector<:string>::const_iterator it; for(it=data.begin();it!=data.end();it++) { inv((*it)); }返回inv; }

标签: c++ postgresql libpqxx


【解决方案1】:

vect的类型改为std::vector&lt;std::optional&lt;std::string&gt;&gt; vect; 并将 std::nullopt 设置为要分配为 null 的元素。就是这样。

【讨论】:

    猜你喜欢
    • 2014-06-29
    • 2011-05-31
    • 2021-07-06
    • 2012-03-27
    • 1970-01-01
    • 2015-03-22
    • 2012-08-11
    • 2017-12-16
    • 1970-01-01
    相关资源
    最近更新 更多