NULL
当您的查询在一个空集上运行时,它不会返回 {null},而是一个包含该值的一列一行的结果表。您必须获取该行的值以确定它是否为NULL
.
(而且你忘了调用 sqlite3_finalize()。)
此外,您不应仅仅为了确定结果是否为空而执行两次查询。您的db.query
函数应该NULL
正确处理值。
以下是一个函数,它需要一个返回单个数字(作为您的MAX
查询)或的查询NULL
:
int CC_Database::singleNumberQuery(const string& query, bool& resultIsValid)
{
sqlite3_stmt *stmt;
int result;
resultIsValid = false;
int rc = sqlite3_prepare_v2(database, query.c_str(), -1, &stmt, NULL);
if (rc != SQLITE_OK) {
printf("error: %s\n", sqlite3_errmsg(database));
// or throw an exception
return -1;
}
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE && rc != SQLITE_ROW) {
printf("error: %s\n", sqlite3_errmsg(database));
// or throw an exception
sqlite3_finalize(stmt);
return -1;
}
if (rc == SQLITE_DONE) // no result
result = -1;
else if (sqlite3_column_type(stmt, 0) == SQLITE_NULL) // result is NULL
result = -1;
else { // some valid result
result = sqlite3_column_int(stmt, 0);
resultIsValid = true;
}
sqlite3_finalize(stmt);
return result;
}
(如果-1
不能是有效的返回值,则不需要该resultIsValid
参数。)