sqlite3_column_text返回的SQLite奇怪值

时间:2016-11-13 18:56:19

标签: c++ sqlite

我有一个c ++项目,其中安装了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 );

我期待“Andrea”但是这段代码打印出来:   - PÝòea   - ð¶òea   - ð§òea

每次都有不同的结果。

1 个答案:

答案 0 :(得分:2)

根据sqlite3_column_text documentation,指针tsqlite3_finalize之后变为无效:

  

换句话说,你应该首先调用 sqlite3_column_text(),sqlite3_column_blob()或sqlite3_column_text16()来强制结果为所需的格式,然后调用sqlite3_column_bytes()或sqlite3_column_bytes16()来查找结果的大小。

     

返回的指针有效,直到如上所述发生类型转换,或直到调用sqlite3_step()或sqlite3_reset()或 sqlite3_finalize()为止。

正如@tkausl所建议的那样,为了解决这个问题,你应该在sqlite3_finalize调用之前打印数据或将其复制到某个地方以供进一步使用。