1

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

3 回答 3

4

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参数。)

于 2013-06-29T08:08:38.893 回答
0

当一条 SQL 语句执行成功时,sqlite3_prepare_v2将返回SQLITE_OK.

于 2013-06-28T22:14:04.353 回答
0

通常你会检查 SQLITE_OK (根据sqlite docs)。如果响应不是 SQLITE_OK,那么您将调用 sqlite3_errmsg(database) 来发现错误。

显然,如果您没有错误,那么您可以使用 sqlite3_step(statement) 逐步执行查询中的结果行

于 2013-06-28T22:15:46.057 回答