使用POCO从数据库检查NULL值

时间:2014-04-28 07:50:52

标签: c++ visual-studio-2012 poco-libraries

我正在使用带有ODBC连接器的POCO::Data进行查询,我需要从代码中检查NULL值。在文档中,Recordset对象is supposed to have the function isNull,但我下载的代码here不包含此类方法(版本 1.4.6p4 )。< / p>

如何使用POCO库检查值是否为NULL?我试图用从数据库中检索的数据创建一个JSON字符串。

我的实际代码如下:

Session session(bdName, conn);
Statement select(session);  

select << sSQL;  
select.execute();

RecordSet rs(select);
bool more = rs.moveFirst();
std::size_t cols = rs.columnCount();

sResult = "{\"rowsField\":[";

while (more) {
    if (sResult.back() != '[') sResult += ','; // Not first time
    sResult += "{\"columnsField\":[";

    for (std::size_t col = 0; col < cols; ++col) {
        std::string cName = rs.columnName (col);
        std::string tName = getPocoTypeName(rs.columnType(col));
        std::string val = "";

        if (!rs[col] || rs.value(col).isEmpty()) 
            val = "NULL"; // DOES NOT WORK
        else
            val = rs[col].convert<std::string>();

        if (col != 0) sResult += ',';
        sResult += "\n{\"nameField\":\"" + cName + '\"';
        sResult += ",\"typeField\":\"" + tName + '\"';
        sResult += ",\"valueField\":\"" + val + '\"';

        sResult += "}"; // each JSON column/value
    }
    sResult += "]}\n"; // columnsField (one per row)

    more = rs.moveNext();
}

3 个答案:

答案 0 :(得分:0)

使用Nullable<std::string> val = std::string("");

isNullNullable的成员,因此您可以检查返回值是否为空。

答案 1 :(得分:0)

我知道这是一个老问题,但我遇到了问题。我也格式化为JSON字符串。您可以使用Poco::Recordset::IsNull(ColumnName)检查给定列名称的值是否为NULL。

以下代码将使用空字符串替换NULLS以防止抛出错误:

Poco::Data::Statement statement(session);
statement << query;
statement.execute();
Poco::Data::RecordSet record_set(statement);

bool more = record_set.moveFirst();

while (more)
{
    std::map<std::string, std::string> row;

    for (std::size_t i = 0; i < record_set.columnCount(); ++i)
    {
         std::string val = "";
         if(!record_set.isNull(record_set.columnName(i)))  
             val = record_set[i].convert<std::string>(); 
           // print results for testing
         cout << "->" << record_set.columnName(i) << ":{" << val << "}";
    }

    ret.push_back(row);
    more = record_set.moveNext();
}

答案 2 :(得分:0)

使用record_set[col].isEmpty()检查NULL。