2016-11-13 11 views
0

私はsqliteがインストールされているC++プロジェクトを持っています。 sqlite3_column_textによって返されるSQLiteの奇妙な値

アプリケーションがこのコードを使用してデータベースを作成します開始し

// Open connection with database 
if (SQLITE_OK != sqlite3_open_v2("Test.db", &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, nullptr)) { 
    return false; 
} 

// Delete old tables if exists 
char * error; 

if (SQLITE_OK != sqlite3_exec(db, "DROP TABLE IF EXISTS Tests;", nullptr, nullptr, &error)) { 
    return false; 
} 

// Recreate all tables 
if (SQLITE_OK != sqlite3_exec(db, "CREATE TABLE Tests(testID INTEGER PRIMARY KEY ASC, name TEXT NOT NULL);", nullptr, nullptr, &error)) { 
    return false; 
} 

// Test only 
if (SQLITE_OK != sqlite3_exec(db, "INSERT INTO Tests(testID, name VALUES (1, 'Andrea');", nullptr, nullptr, &error)) { 
    return false; 
} 

私はこのコードを実行すると:

sqlite3_stmt *query = nullptr; 
if (SQLITE_OK != sqlite3_prepare_v2(db, "SELECT testID, name FROM Tests;", -1, &query, nullptr)) { 

} 

unsigned char const * t = nullptr; 
if (SQLITE_ROW == sqlite3_step(query)) { 
    t = sqlite3_column_text(query, 1); 
    sqlite3_finalize(query); 
} 

printf((char*)t); 

私は「アンドレア」期待していますが、このコードの印刷を: - PÝòea - ð¶òea - 毎回ð§òea

異なる結果。

+1

確定する前に印刷してください – tkausl

+0

ありがとうございました、今すぐ機能します! –

+0

別のバグがあります。 'sqlite3_step()'の結果に行がなくなると、SQLITE_DONEが返されます。その場合は 'sqlite3_finalize()'も呼び出す必要があります。したがって、 'sqlite3_finalize()'は 'if(SQLITE_ROW == sqlite3_step(query))'ブロックの後に置かなければなりません。 – BJovke

答えて

2

sqlite3_column_textdocumentationによると、ポインタtsqlite3_finalize後に無効になる:つまり

は、あなたに結果を強制的に最初sqlite3_column_text()、sqlite3_column_blob()、またはsqlite3_column_text16()を呼び出す必要がありますその結果のサイズを調べるには、sqlite3_column_bytes()またはsqlite3_column_bytes16()を呼び出します。

上記のように、またはsqlite3_step()またはsqlite3_reset()またはsqlite3_finalize()が呼び出されるまで、返されるポインタは有効です。

あなたがデータを印刷したり、sqlite3_finalizeが呼ばれる前に、さらなる使用のためにどこかにコピーする必要があり、問題を解決するために、@tkauslによって示唆されるように。

関連する問題