C ++ SQLite确定查询结果是否为{null}

时间:2013-06-28 21:50:08

标签: c++ sqlite

我正在尝试构建一个函数来确定查询是否返回{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;")) {
    ...
}

3 个答案:

答案 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(语句)逐步查看查询中的结果行