2014-04-28 9 views
0

ODBC 커넥터로 POCO::Data을 사용하여 쿼리를 만들고 있는데 코드에서 NULL 값을 확인해야합니다. 설명서에서 Recordset 개체는 is supposed to have the function isNull이지만 코드를 다운로드 한 here에는 해당 메서드가 없습니다 (버전 1.4.6p4).POCO를 사용하여 데이터베이스에서 NULL 값 확인

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

사용하면 반환 값이 null의 경우 검사 할 수 있도록 Nullable<std::string> val = std::string("");

isNullNullable의 구성원 인 ..

1

나는 이것이 오래된 질문이라는 것을 알고 있지만 문제가있다. 나는 또한 JSON 문자열로 포맷하고있다. Poco::Recordset::IsNull(ColumnName)을 사용하여 주어진 열 이름의 값이 NULL인지 여부를 확인할 수 있습니다.

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(); 
} 
: 빈 문자열로 NULLS를 대체 ​​할

아래의 코드는 던지는 오류를 방지하기 위해