1

オブジェクト内の重複するsqliteコードを削減しようとしています。そうするために、私はsqliteの相互作用を持ち、sqlite3_stmtを返す1つのメソッドが必要でした。私の問題は、sqlite3_stmtポインターが常にnullであるということです。私の質問は、私は何か間違ったことをしているのですか、それともsqliteでこれを行うことができないのですか?

使用法:

SqliteIO sqldb;
string GET_CONFIG = "select* from config; ";
sqlite3_stmt *statement;
assert(sqldb.sqlForResults(GET_CONFIG, statement));
assert(statement != NULL); //this fails

方法:

bool SqliteIO::sqlForResults(string pSql, sqlite3_stmt *statement ){
bool lbRetVal=false;

if(mDB == NULL){
    cerr << "No database to query";
    Logger::error("SqlliteIO::getAllScheuled() null database handle");
} else {
    sqlite3_busy_timeout(mDB, 2000);
    if(sqlite3_prepare_v2(mDB, pSql.c_str(), -1, &statement, 0) == SQLITE_OK) {
        lbRetVal = true;
    }
    string error = sqlite3_errmsg(mDB);
    if(error != "not an error"){
        cerr << pSql << " " << error << endl;
        Logger::error("SqlliteIO::sqlForResults() "+ error + " " +pSql  );
    }
}
return lbRetVal;
4

2 に答える 2

1
sqlite3_stmt *statement; // this never gets initialized
assert(sqldb.sqlForResults(GET_CONFIG, statement));
assert(statement != NULL); //this fails

そのコード ブロックのステートメント変数は初期化されません (そのコピーを sqlForResults() に渡します)。

率直に言って、ステートメントにガベージ値が含まれる可能性があるため、アサーションが失敗することは幸運です(コンパイラのデバッグモードでは変数がゼロで初期化されていると思います)

于 2012-07-18T17:05:08.163 に答える