考慮下面的代碼片斷:這是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()」後我需要做些什麼嗎?或者我只需升級編譯器?
但是如何調用「sqlite3_prepare_v2()」成功?另外,請檢查我的編輯 - 我添加更多的代碼。謝謝。 – Igor
@Igor請看我的編輯。 – Rakete1111
現在一切正常。將「sqlite3_bind_text()」最後一個參數更改爲「SQLITE_TRANSIENT」修復了問題。出於某種原因,我很確定我需要SQLITE_STATIC。再次和新年快樂。 – Igor