考虑下面的代码片断:这是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