const char* sqlstr = "select count(id) from ?";
sqlite_prepare_v2(mConn, sqlstr, -1, &smtm, NULL)
関数はエラーを返します。エラー メッセージは から取得しましたsqlite3_errmsg(mConn)
。それはnear "?": syntax error
なぜですか?
select ? from account
通過します。
SQLite (またはその他の SQL エンジン) では、パラメーター化された変数を挿入、更新、または制約する値としてのみ使用できます。左辺値として使用する場合、キーワード、テーブル名、または列名の代わりに、SQL ステートメントの任意の部分で使用することはできません。
これは、SQLite が SQL ステートメントを解析し、それを他のテーブルと結合する方法、使用するインデックス、およびクエリ プランになる同様の決定を決定する必要があるためです。
2番目の例のように動的にバインドされた変数は、クエリプランを変更せず、使用しても問題ありませんが、テーブル名を変更すると、SQLiteはまったく好きではありません.
テーブル名を動的に指定する必要がある場合は、コード内で SQL 文字列を動的に生成し、その文字列を SQLite に渡して、テーブル名が既に存在するようにすることができます ( としてではありません?
)。