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()クエリを実行するために必要な回数だけ実行し、 etcsqlite3_column_bytes()を使用してデータを取得します
  3. 準備されたクエリを破棄するsqlite3_finalize()

ただし、より多くのコーディングと慎重なエラー処理が必要です。

于 2014-10-20T10:31:34.980 に答える
1

コールバックの呼び出しは、どのように機能するようsqlite3_execに設計されているかです。

結果にすべてのメモリを割り当ててそれを返す関数が必要な場合は、のような別の関数が必要ですsqlite3_get_table

于 2013-02-07T08:33:03.303 に答える