我正在尝试构建一个函数来确定查询是否返回{null}。由于某种原因,它总是返回false。我做错了什么?
bool CC_Database::checkNullQuery(string query)
{
sqlite3_stmt *statement;
if(sqlite3_prepare_v2(database, query.c_str(), -1, &statement, 0) == SQLITE_NULL)
{
cout << "null" << endl;
return true;
} else {
cout << "not null" << endl;
return false;
}
}
用于调用函数的代码
if (!db->checkNullQuery("SELECT MAX(Inventory_ID) FROM Inventory;")) {
...
}
答案 0 :(得分:2)
当您的查询在空集上运行时,它不会返回{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
参数。)
答案 1 :(得分:0)
成功执行SQL语句后,sqlite3_prepare_v2
将返回SQLITE_OK
。
答案 2 :(得分:0)
通常你会检查SQLITE_OK(根据sqlite docs)。如果响应不是SQLITE_OK,那么您将调用sqlite3_errmsg(数据库)来发现错误。
显然,如果您没有错误,那么您可以继续使用sqlite3_step(语句)逐步查看查询中的结果行