我正在使用带有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();
}
答案 0 :(得分:0)
使用Nullable<std::string> val = std::string("");
isNull
是Nullable
的成员,因此您可以检查返回值是否为空。
答案 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。