2014-02-05 19 views
2

В следующем фрагменте кода объект std :: string с именем mac иногда представляет собой пустую строку (например, «"), и я хочу, чтобы подготовленный оператор обрабатывал эту переменную автоматически как null. Интересно, как это можно достичь в приведенном ниже коде. В моих попытках Google я обнаружил, что есть способ установить флаг, указывающий нулевое значение, но я не смог найти конкретный пример. Не могли бы вы привести пример для достижения этого? Thnx.Вставка NULL/пустой строки с использованием библиотеки libpqxx

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 
    ..... 
} 

Оператор Insert выглядит следующим образом:

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

С libpqxx вы можете отправить пустое значение, вызвав оператор() на подготовленный без аргументов, например:

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) 
Смежные вопросы