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

snvhrwxg  于 2023-06-23  发布在  SQLite
关注(0)|答案(3)|浏览(252)

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

gdx19jrr1#

当查询在空集上运行时,它不会返回{null},而是返回一个包含NULL值的一列和一行的结果表。您必须获取该行的值以确定它是否为NULL
(And忘记调用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;
}

(If -1不能是有效的返回值,您不需要resultIsValid参数。)

am46iovg

am46iovg2#

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

d7v8vwbk

d7v8vwbk3#

通常情况下,您会检查SQLITE_OK(按照sqlite docs)。如果响应不是SQLITE_OK,那么您将调用sqlite3_errmsg(数据库)来发现错误。
显然,如果没有错误,那么可以使用sqlite3_step(statement)单步执行查询结果行

相关问题