3

私はたくさんグーグルで検索しましたが、解決策が見つかりませんでした。現在、Codegear 2007 C++ でアプリを作成しています。私は私の小さな子猫のためにこのアプリを書いています。

だから私は2つのテーブルを持っています(コードブロックの方法がわかりませんでした):

  • 子猫情報
  • 子猫データ。

KittenInfo 名前と ID ( 主キー )、性別と出生を保存します。これは機能します。

もう 1 つは Blob を格納する必要があります。だから、たくさんの方法を試した後。通常の挿入でクエリを実行し、ブロブテーブルを除外すると、テーブルに保存されず、他のデータにも保存されません。

だから、私は何が間違っているのかわかりませんが、これまでのところ SQLite が大好きです。後戻りはありませんか?

機能は次のとおりです。

void CDatabase::InsertKittenData(int Kitten_ID, int kittenDay, bool DayOrWeek,
    char * kitten_weight, char * Kitten_Comment, string PhotoFile) {

    unsigned char * blob;

    ifstream::pos_type size;
    int size2 = 0;
    if (FileExists(PhotoFile.c_str())) {
        ifstream file(PhotoFile.c_str(), ios::in | ios::binary | ios::ate);
        if (file.is_open()) {
            size = file.tellg();
            blob = new char[size];
            file.seekg(0, ios::beg);
            file.read(blob, size);
            file.close();
        }

    }
    else {
        blob = NULL;
    }
    sqlite3 *dbp;
    sqlite3_stmt *ppStmt;
    // NULL = primary key autoinc.
    char * Sql = "INSERT INTO KittenData VALUES ( NULL, ? , ? ,? , ? , ? , ?);";


    int rc = sqlite3_open("KittyBook.db", &dbp);
    if (rc)
        return;

    if (sqlite3_prepare_v2(dbp, Sql, -1, &ppStmt, NULL) != SQLITE_OK) {
        return;
    }

    if (ppStmt) {
        if (sqlite3_bind_int(ppStmt, 1, Kitten_ID) != SQLITE_OK)
            return;

        if (sqlite3_bind_int(ppStmt, 2, kittenDay) != SQLITE_OK)
            return;
        if (sqlite3_bind_int(ppStmt, 3, DayOrWeek) != SQLITE_OK)
            return;

        if (sqlite3_bind_text(ppStmt, 4, // Index of wildcard
            kitten_weight, strlen(kitten_weight), // length of text
            SQLITE_STATIC) != SQLITE_OK)
            return;
        if (sqlite3_bind_text(ppStmt, 5, // Index of wildcard
            Kitten_Comment, strlen(Kitten_Comment), // length of text
            SQLITE_STATIC) != SQLITE_OK)
            return;

        if (sqlite3_bind_blob(ppStmt, 6, blob, size2, SQLITE_TRANSIENT)
            != SQLITE_OK)
            return;

        if (sqlite3_step(ppStmt) != SQLITE_DONE)
            return;
    }

    sqlite3_finalize(ppStmt);

    sqlite3_exec(dbp, "COMMIT", NULL, NULL, NULL);

    sqlite3_close(dbp);

}
4

2 に答える 2

0

宣言しsize2てゼロとして初期化します。

int size2 = 0;

の次の使用はsize2、ブロブをバインドするときです。

sqlite3_bind_blob(ppStmt, 6, blob, size2, SQLITE_TRANSIENT)

細かいマニュアルから:

4 番目の引数を持つルーチンでは、その値はパラメーターのバイト数です。明確にするために、値は文字数ではなく、値のバイト数です。

この場合の 4 番目の引数は でsize2あり、それはゼロです。その結果、長さ 0 の BLOB をバインドするように SQLite に指示しているのに、なぜ何も格納されないのか不思議に思うことになります。SQLite に 0 バイトを保存するように要求していて、SQLite は指示されたことだけを実行しているため、何も保存されません。

sizeおそらく、代わりに使用したいでしょうsize2

于 2012-05-14T20:23:04.040 に答える
0

mu が短すぎるため、関数を段階的に実行し、列ごとに増加させるというアイデアが得られました。私が間違ったことを知りませんが、現在は機能しています。

乾杯ムーは短すぎます:)

于 2012-05-15T12:47:16.140 に答える