4

在下面的代码片段中,名称为 mac 的 std::string 对象有时是一个空字符串(即“”),我希望准备好的语句自动将此变量视为 null。我想知道如何在下面的代码中实现这一点。在我的谷歌搜索尝试中,我碰巧发现有一种方法可以设置一个指示空值的标志,但我找不到具体的例子。您能否提供一个示例来实现这一目标?谢谢。

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

2 回答 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)
于 2014-02-05T10:54:36.863 回答
2

快速决策...添加一个参数,指示何时插入 NULL 字段

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

链接到文档

于 2018-03-22T08:11:48.770 回答