使用libpqxx库插入NULL/空字符串

5
在下面的代码片段中,名称为mac的std :: string对象有时是一个空字符串(即“”),我希望预处理语句自动将此变量视为空。我想知道如何在下面的代码中实现这一点。在我的搜索尝试中,我发现有一种设置指示空值的标志的方法,但我找不到具体的示例。您能提供一个实现此目的的示例吗?谢谢。
try
{
  mConnection->prepare("insertBulkData", mSqlInsertStmt);
  pqxx::work xAction(*mConnection); 

  for(uint32_t i = 0; i < tList.size(); i++)
  {
    TCoreDTO* tCore = tList[i];              
    const std::string& mac   = tCore->getMac();
    const std::string& uuid  = tCore->getUUID();
    int coreNo = (int)tCore->getCoreNo();
    xAction.prepared("insertBulkData")(mac)(uuid)(coreNo).exec();
  }
  xAction.commit();
}
catch(std::exception& pqExp)
{
  //Error handling code
  .....
}

插入语句如下:
std::string mSqlInsertStmt 
= "INSERT INTO T_CORES (MAC, UUID, CORE_NO) VALUES ($1, $2, $3)";

表结构如下:
CREATE TABLE IF NOT EXISTS T_CORES (
ID     SERIAL PRIMARY KEY,                            
MAC    TEXT, 
UUID   TEXT, 
CORE_NO INT DEFAULT 0);  

对于那些使用没有 Invocation 类的版本的人:https://dev59.com/iLPma4cB1Zd3GeqPspFT#66851576 - Oğuzhan Türk
2个回答

9

使用 libpqxx,您可以通过在没有参数的准备语句上调用 operator() 来发送空值,例如:

xAction.prepared("insertBulkData")()(uuid)(coreNo).exec();

当执行语句时,第一个参数会发送空值(NULL)。

我认为你无法让程序自动将空字符串替换为NULL。实现这一点的方法之一是修改你正在使用的SQL:

INSERT INTO T_CORES (MAC, UUID, CORE_NO) VALUES (CASE WHEN $1='' THEN NULL ELSE $1 END, $2, $3)

2

快速决策... 添加一个参数,用于指示何时插入到空字段中。

xAction.prepared("insertBulkData")(mac,!mac.empty())(uuid)(coreNo).exec();

链接到文档

该链接指向文档页面。

嗯...看起来这应该是2020年的最佳答案。 - juzzlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接