私は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
}
}