繁体   English   中英

Sqlite C ++ Image to Blob不会存储任何内容

[英]Sqlite C++ Image to Blob wont store nothing

我google了很多,找不到任何解决方案。 我现在正在为Codegear 2007 C ++编写一个应用程序。 我正在为我的小小猫写这个应用程序,它有点'乳制品,但我称之为KittyBook。

所以我有两个表(抱歉不明白CodeBlock如何):

  • 小猫信息
  • 小猫数据。

KittenInfo存储他们的名字和他们的ID(主键),他们的性别和他们的出生。 这个有效。

另一个应该存储一个Blob。 在尝试了这么多方法之后。 如果我使用普通插入执行查询但不包括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);

}

您将size2声明并初始化为零:

int size2 = 0;

然后下一次使用size2就是绑定blob时:

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

精细手册

在具有第四个参数的那些例程中,其值是参数中的字节数。 要清楚:值是值中的字节数,而不是字符数。

在这种情况下,第四个参数是size2 ,它是零。 结果是你告诉SQLite绑定一个零长度blob然后你想知道为什么没有存储。 好吧,没有任何东西可以存储,因为你要求SQLite存储零字节,而它只是按照它所说的去做。

也许你想使用size而不是size2

mu太短了,给了我一步一步地逐行增加功能的想法。 不知道我做错了什么,但现在正在努力。

干杯太短了:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM