6

有什么方法可以在不通过回调的情况下获得 sqlite3_exec() 结果?当我进行搜索时,我想直接获得结果,最像函数的返回还是作为 OUT 参数?

谢谢。

4

4 回答 4

10

我已经编写了一些代码,允许我们根据 sql 查询(zSql)从打开的数据库(db)中读取数据而无需回调。请注意,此代码有效,但可能仍需要一些工作(例如,我不确定我们是否需要释放文本数据......)

int RunSqlNoCallback(sqlite3 * db, const char * zSql)
{
    sqlite3_stmt *stmt = NULL;
    int rc = sqlite3_prepare_v2(db, zSql, -1, &stmt, NULL);
    if (rc != SQLITE_OK)
        return rc;

    int rowCount = 0;
    rc = sqlite3_step(stmt);
    while (rc != SQLITE_DONE && rc != SQLITE_OK)
    {
        rowCount++;
        int colCount = sqlite3_column_count(stmt);
        for (int colIndex = 0; colIndex < colCount; colIndex++)
        {
            int type = sqlite3_column_type(stmt, colIndex);
            const char * columnName = sqlite3_column_name(stmt, colIndex);
            if (type == SQLITE_INTEGER)
            {
                int valInt = sqlite3_column_int(stmt, colIndex);
                printf("columnName = %s, Integer val = %d", columnName, valInt);
            }
            else if (type == SQLITE_FLOAT)
            {
                double valDouble = sqlite3_column_double(stmt, colIndex);
                printf("columnName = %s,Double val = %f", columnName, valDouble);
            }
            else if (type == SQLITE_TEXT)
            {
                const unsigned char * valChar = sqlite3_column_text(stmt, colIndex);
                printf("columnName = %s,Text val = %s", columnName, valChar);
                free(valChar);
            }
            else if (type == SQLITE_BLOB)
            {
                printf("columnName = %s,BLOB", columnName);
            }
            else if (type == SQLITE_NULL)
            {
                printf("columnName = %s,NULL", columnName);
            }
        }
        printf("Line %d, rowCount = %d", rowCount, colCount);

        rc = sqlite3_step(stmt);
    }

    rc = sqlite3_finalize(stmt);

    return rc;
}
于 2016-01-19T09:33:08.773 回答
2

sqlite3_exec是一个方便的包装器。

如果你不需要回调,你应该使用底层函数:sqlite3_prepare_v2(), sqlite3_step(), 和sqlite3_finalize()直接。

  1. 编译sql查询sqlite3_prepare_v2()
  2. 根据需要运行sqlite3_step()多次以执行查询,使用 sqlite3_column_bytes()等来检索数据
  3. 销毁准备好的查询sqlite3_finalize()

但它需要更多的编码和仔细的错误处理。

于 2014-10-20T10:31:34.980 回答
1

调用回调是sqlite3_exec设计的工作方式。

如果你想要一个为结果分配所有内存并返回的函数,你需要一个不同的函数,比如sqlite3_get_table.

于 2013-02-07T08:33:03.303 回答
0

回调是sqlite3_exec ()用于返回一个或多个结果的机制。看起来它的主要用途是使用 select SQL 语句。如果 select SQL 语句返回多行结果,则指定的回调函数由每行的 sqlite 功能调用。

我不确定您使用的是 C 还是 C++ 或其他一些语言,但是我有一个可能的解决方案供您使用 C 和 SQLite。

回调函数的第一个参数是一个 void 指针,它可以指向几乎任何东西。例如,它可以指向一个结构,该结构包含指向为结果分配的内存区域的指针以及指示内存区域大小的参数。

我回答了这个 stackoverflow 问题,使用 sql3_exec,并举例说明了使用一个使用 select SQL 语句的结果填充 C 结构的回调。在此示例中,我有一个回调,它从选择中获取一个或多个行结果,并将结果转换为数据值以放入 C 结构中。当sqlite3_exec()函数返回时,我使用 C 结构处理来自 select 的结果。

这可能是您正在寻找的,因为您可以创建选择 SQL 语句、设置结果结构、调用sqlite3_exec()指定结果结构以及指向回调的函数指针以使用结果结构处理结果,以及何时sqlite3_exec()返回你有你选择的结果。选择的结果将在您调用的位置sqlite3_exec()

于 2013-06-06T17:37:58.960 回答