2016-12-29 147 views
1

考慮下面的代碼片斷:這是MSVC 2010中的錯誤還是我做錯了什麼?

在database_sqlite.h:

class __declspec(dllexport) SQLiteDatabase : public Database 
{ 
    virtual void GetTableProperties(DatabaseTable *table, std::vector<std::wstring> &errorMsg); 
protected: 
    struct SQLiteImpl; 
}; 

struct SQLiteDatabase::SQLiteImpl 
{ 
    std::wstring m_catalog; 
    std::wstring_convert<std::codecvt_utf8<wchar_t> > m_myconv; 
}; 

在database_sqlite.cpp:

void SQLiteDatabase::GetTableProperties(DatabaseTable *table, std::vector<std::wstring> &errorMsg) 
{ 
    sqlite3_stmt *stmt = NULL; 
    std::wstring errorMessage; 
    int result; 
    std::wstring query = L"SELECT * FROM \"sys.abcattbl\" WHERE \"abt_tnam\" = ? AND \"abt_ownr\" = ?;"; 
    const unsigned char *dataFontName, *headingFontName, *labelFontName; 
    int res = sqlite3_prepare_v2(m_db, sqlite_pimpl->m_myconv.to_bytes(query.c_str()).c_str(), (int) query.length(), &stmt, 0); 
    if(res == SQLITE_OK) 
    { 
const char *name = sqlite_pimpl->m_myconv.to_bytes(table->GetTableName().c_str()).c_str(); // I used this line for debugging purposes 
    res = sqlite3_bind_text(stmt, 1, sqlite_pimpl->m_myconv.to_bytes(table->GetTableName().c_str()).c_str(), -1, SQLITE_STATIC); 
    if(res == SQLITE_OK) 
    { 
     res = sqlite3_bind_text(stmt, 2, sqlite_pimpl->m_myconv.to_bytes(table->GetSchemaName().c_str()).c_str(), -1, SQLITE_STATIC); 
     if(res == SQLITE_OK) 
     { 
      while(true) 
      { 

字符* result_query = sqlite3_expanded_sql(語句); res = sqlite3_step(stmt);

這裏* result_query contains =「SELECT * FROM」sys.abcattbl「WHERE」abt_tnam「=''AND」abt_ownr「='';」 我正在使用MSVC2010,令我驚訝的是,「* name」包含空字符串。第一次調用「to_bytes()」成功,因爲我可以檢查將要使用的查詢。

第一次打電話給「to_bytes()」後我需要做些什麼嗎?或者我只需升級編譯器?

回答

0

不,你做錯了什麼。

我實際上並不什麼現在to_bytes回報,但我認爲它是一個std::basic_string型基極,使std::string和家人。

to_bytes返回一個臨時對象到字符串實例,所以當你打電話c_str(),你得到一個指針,指向陳述結束後不再存在的字符串的第一個字符。你基本上有未定義的行爲,因爲name是一個懸掛指針,你試圖輸出它。

你必須分配內存和字符串複製到它,或只是使用std::string,也不會發生類型的問題在哪裏。

您撥打sqlite3_prepare_v2成功的原因是因爲to_bytes返回的字符串仍然存在。當語句結束時字符串被破壞,所以當res被分配了返回值sqlite3_prepare_v2。之前沒有,因此調用成功,因爲傳遞了一個有效的字符串指針。

儘管如此,請升級您的編譯器。

+0

但是如何調用「sqlite3_prepare_v2()」成功?另外,請檢查我的編輯 - 我添加更多的代碼。謝謝。 – Igor

+0

@Igor請看我的編輯。 – Rakete1111

+1

現在一切正常。將「sqlite3_bind_text()」最後一個參數更改爲「SQLITE_TRANSIENT」修復了問題。出於某種原因,我很確定我需要SQLITE_STATIC。再次和新年快樂。 – Igor

相關問題