1

私はSQLクエリを準備し、それをsqliteデータベースに対して実行する関数を書いています。クエリを使用してテーブルに値を挿入しています。クエリは次のようになります。

   "insert into files values (?, ?, ?, ?, ?, 0)";

行が挿入されますが、最後のフィールドである0を除いて、テキストフィールドのすべての値は空です。最初の5つのフィールドのタイプはTEXTです。

    // If I hard code a value for value.data() then the row is inserted correctly with my hardcoded data, the exact line is below
    status = sqlite3_bind_text(ppStmt, index, /* if I hardcode it works*/ value.data(), -1, SQLITE_STATIC);

完全な関数を以下に示します。リストは呼び出し元によってスタック上に作成されます。疑問符が文字列引数に置き換えられない理由はわかりませんが、ハードコードされたものは機能します。エラーコードは返されません。

    //db is already open before I call this
void MediaCache::prepareAndExecuteQuery(string query, list<string> args)
{

    sqlite3_stmt *ppStmt = 0;
    const char **pzTail = 0;
    int status = 0;

    if( sqlite3_prepare_v2(db, query.data(), query.length(), &ppStmt, pzTail) != SQLITE_OK )
    {
        string error = sqlite3_errmsg(db);
        //throw an exception
    } 

    if(ppStmt)
    {

        list<string>::iterator current = args.begin();
        int index = 1;

        for(current = args.begin() ; current != args.end(); current++)
        {
            string value = *current;            
            status = sqlite3_bind_text(ppStmt, index, value.data(), -1, SQLITE_STATIC);

            if(status != SQLITE_OK)
            {
                //log error;
            }

            index++;
        }   

        status = sqlite3_step(ppStmt);
        status = sqlite3_finalize(ppStmt);
        //sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);
    }
    else
    {
        //ppStmt is null
        //throw an exception
    }

}
4

1 に答える 1

2

問題はここにあると思います:

string value = *current;            
status = sqlite3_bind_text(ppStmt, index, value.data(), -1, SQLITE_STATIC);

この場合value、ステートメントの実行が行われる前にスコープ外になります。したがって、に指定されたポインタは無効にsqlite3_bind_textなります。これを「修正」するには、SQLITE_TRANSIENTを使用します。これにより、ライブラリは、戻る前にデータの独自のコピーを作成するように強制されます。

また、C ++ 11を使用していない場合、NULLで終了することが保証されているとは思いませんstring::data()。その場合、-1パラメーターが正しくない可能性があります。value.length()多分それは代わりであるべきです。

于 2013-01-23T19:18:25.953 に答える