使用POCO检查数据库中的NULL值

Checking NULL values from Database using POCO

本文关键字:NULL 数据库 POCO 检查 使用      更新时间:2023-10-16

我使用带ODBC连接器的POCO::Data进行查询,需要检查代码中的NULL值。在文档中,Recordset对象应该具有函数isNull,但我在此处下载的代码不包含这样的方法(目前版本1.4.6p4)。

如何使用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();
}

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

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

我知道这是一个老问题,但我遇到了问题。我还将其格式化为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();
}

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