0

私のコードは非常に単純です。空のテーブルを作成するだけです。これは私のコードです:

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

int main(int argc, char *argv[])
{
    sqlite3 *ppdb;
    int retval;

    retval = sqlite3_open_v2("v2.db", &ppdb, 
                        SQLITE_OPEN_CREATE, "unix-none");
    if (retval != SQLITE_OK)
    {
        printf(stderr, "%s\n", sqlite3_errmsg(ppdb));
        return 1;
    }
    retval = sqlite3_exec(ppdb, 
             "CREATE TABLE IF NOT EXISTS userinfo \
             (id TEXT PRIMARY KEY, pass TEXT NOT NULL)",
             NULL, NULL, NULL);
    if (retval != SQLITE_OK)
    {
        fprintf(stderr, "%s\n", sqlite3_errmsg(ppdb));
        return 1;
    }
    sqlite3_close(ppdb);
    return 0;
}

しかし、実行すると、次のエラーメッセージが表示されました。

Out of memory

sqlite3_open_v2このコードをデバッグすると、返されたことがわかりました21(ライブラリが正しく使用されていません)

それを解決する方法は?

4

1 に答える 1

7

細かいマニュアルから:

flagsパラメータsqlite3_open_v2()は、次の3つの値のいずれかを取ることができます[...]:

SQLITE_OPEN_READONLY
データベースは読み取り専用モードで開かれます。データベースがまだ存在しない場合は、エラーが返されます。

SQLITE_OPEN_READWRITE
データベースは、可能であれば読み取りと書き込みのために開かれます。または、ファイルがオペレーティングシステムによって書き込み保護されている場合にのみ読み取りが行われます。いずれの場合も、データベースはすでに存在している必要があります。存在しない場合は、エラーが返されます。

SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE
データベースは読み取りと書き込みのために開かれ、データベースがまだ存在しない場合は作成されます。sqlite3_open()これは、とに常に使用される動作ですsqlite3_open16()

したがって、を使用することはできません。ファイルを作成する場合は、ビットSQLITE_OPEN_CREATEを含める必要があります。SQLITE_OPEN_READWRITE

retval = sqlite3_open_v2("v2.db", &ppdb,
                    SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, "unix-none");
于 2012-10-20T04:43:10.787 に答える