Erfolgreich eingefügt blob-Daten in SQLite-Datenbank, kann aber nicht die Daten eingefügt

Ich BLOB zum einfügen eines Objekts zu einer SQLite-Datenbank. Nach dem einsetzen, kann ich die Daten mit "SELECT" - Satz und die Daten korrekt sind, obwohl die Zeile von "TASK_HEAD" ist "Leer", wenn das durchsuchen der Datenbank mit "SQLite Database Browser".
Allerdings, wenn ich Sie zerstören das Objekt, das gerade eingefügt wurde, kann ich nicht die richtigen Daten mehr, mit dem Zeiger "pHead" verweist auf eine Adresse, wo die Inhalte von dessen "id" - Mitglied ist "铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪UG?" beim Lesen in VS2008 im debug-Modus.

Hier ist ein Beispiel:

//user-defined data type
typedef std::string TASK_ID;
struct TASK_HEAD
{
    TASK_ID id; 
    std::string userData;

    int Size()
    {
        return (id.size() + userData.size()) * sizeof(TCHAR);
    }
};

//when TEST_INSIDE is defined, pHead is invalid; but if undef it, I can get the "head" I just inserted
//and if the blob data is a string (when USING_STRING is defined), I can get the string inserted into the db even though the "test" string has been destroyed
void CDBWriter::WriteTestData()
{
    //open db
    sqlite3* db = NULL;
    int nRet = sqlite3_open(DATABASE_NAME.c_str(), &db);
    if (nRet != SQLITE_OK)
    {
        return;
    }

    if (db != NULL)
    {
        //create a table
        std::string cmdCreate("CREATE TABLE IF NOT EXISTS testTable (id TEXT NOT NULL, TASK_HEAD BLOB, PRIMARY KEY(id));");
        char* errMsg = NULL;
        nRet = sqlite3_exec( db , cmdCreate.c_str() , 0 , 0 , &errMsg );
        if( errMsg != NULL )
        {
            sqlite3_free( errMsg );
            errMsg = NULL;
            return;
        }

//#define USING_STRING
#define TEST_INSIDE
#ifndef TEST_INSIDE
        TASK_HEAD head;
#endif //TEST_INSIDE

        //insert blob data
        const TASK_ID newID(NewGUID()); //NewGUID returns string like this: "5811307F-7AA7-4C44-831F-774FC5832627"
        string query = "INSERT OR REPLACE INTO testTable (id, TASK_HEAD) VALUES ('";
        query += newID;
        query += "', ?1);";
        sqlite3_stmt* res = NULL;
        nRet = sqlite3_prepare_v2(db, query.c_str(), query.length(), &res, 0);
        {
#ifdef TEST_INSIDE
            TASK_HEAD head;
#endif //TEST_INSIDE
            head.id = newID;
#ifdef USING_STRING
            std::string test("ewsjoafijdoaijeofsafsd");
            nRet = sqlite3_bind_blob (res, 1, test.c_str(), test.size(), SQLITE_TRANSIENT);
#else
            int nsizeHead = sizeof(head);
            int nSizeHeadSt = sizeof(TASK_HEAD);
            int sizeString = sizeof(std::string);
            size_t nLen = newID.size();
            //nRet = sqlite3_bind_blob (res, 1, &head, sizeof(head), SQLITE_TRANSIENT);
            nRet = sqlite3_bind_blob (res, 1, &head, head.Size(), SQLITE_TRANSIENT);
#endif //USING_STRING

            if (SQLITE_OK == nRet)
            {
                nRet = sqlite3_step(res);
            }
            if (nRet != SQLITE_OK && nRet != SQLITE_DONE)
            {
                return;
            }
        }

        //get all columns in the database
        query = "SELECT * FROM testTable;";
        nRet = sqlite3_prepare_v2 (db, query.c_str(), query.length(), &res, 0);
        if (SQLITE_OK == nRet)
        {
            while (SQLITE_ROW == sqlite3_step(res))
            {
#ifdef USING_STRING
                const char* pHead = (const char*)sqlite3_column_blob(res, 1);
#else
                const TASK_HEAD *pHead = (const TASK_HEAD*)sqlite3_column_blob(res, 1);
#endif //USING_STRING
                continue;
            }
        }
        sqlite3_finalize(res);
        sqlite3_close(db);
    }
}

Zuerst dachte ich, es könnte das problem von bytes übergeben sqlite3_bind_blob, so bekomme ich die bytes des Objektes eine dumme Methode, wie Sie hier sehen können (die size () - Funktion von TASK_HEAD), aber das hilft nicht.
Dann habe ich versucht zu verwenden SQLITE_STATIC statt SQLITE_TRANSIENT, immer noch nicht funktioniert.
Was ist falsch?

Ps: ich weiß, es ist eine schlechte Lösung zum einfügen eines Objekts in die db, und ich möchte nur wissen, warum ich kann nicht Lesen, wieder meine eingefügten Daten in die db.

InformationsquelleAutor YoungLearner | 2012-05-26
Schreibe einen Kommentar