2

引数文字列が適切にエスケープされるように、LIKE 演算子パターン内で名前付きパラメーター プレースホルダーを使用したかったのです。

at-param プレースホルダーを使用している変更後のコードは次のとおりです。

var stmt = 新しい air.SQLStatement();

stmt.text = "SELECT * FROM コメント WHERE タイトル LIKE '%@search%';";

stmt.parameters["@search"] = "引数文字列";

stmt.execute();

これを行うと、次の詳細を含む SQLError が生成されます

メッセージ: エラー #3315: SQL エラー。

詳細: '@search' パラメーター名がパラメーター プロパティに見つかりましたが、指定された SQL にはありません

マイク・ペティが提案したように、私は試しました:

stmt.text = 'SELECT * FROM コメント WHERE タイトル LIKE "@%search%";';

これにより、同じ SQL エラーの詳細が得られます。

ドキュメントにはこれがあります:

expr ::= (列名 | expr) LIKE パターン

パターン ::= '[ 文字列 | % | _ ]'

私の疑いは、qoutesのためにスキップされているということですが、それを機能させる方法についてのアイデアはありますか?

4

3 に答える 3

4

基本的に次のようにする代わりに、これに対する解決策を見つけました。

var stmt = new air.SQLStatement();
stmt.text = "SELECT * FROM comments WHERE title LIKE '%@search%';";
stmt.parameters["@search"] = "argument string";
stmt.execute();

LIKE 演算子パターン全体のプレースホルダーを配置し、パターンをパラメーターとしてバインドする必要があります。

var stmt = new air.SQLStatement();
stmt.text = "SELECT * FROM comments WHERE title LIKE @search;";
stmt.parameters["@search"] = "%" + userInput + "%";
stmt.execute();
于 2012-06-08T11:46:38.340 に答える
0

あなたの質問から見分けるのは難しいですが、あなたの現在のステートメントはSQLErrorをスローするのか、コンパイルしないのか、それとも結果を返さないのか?

私が推測しなければならなかった場合、私はあなたがここでいくつかの問題を抱えていると言うでしょう:

  1. 選択できるテーブルは1つしかないため、where句の列を修飾する必要はありません。
  2. パラメータ文字列は、技術的にはAIR / Actionscriptによって予約語になっています(大文字と小文字は異なりますが)。それでも少し混乱します。

ドキュメントとコードではコロンまたはアットマークのいずれかを使用できますが、少し見やすいので、私の好みは@です;)

行に期待するクラスのitemClass定義を追加することを忘れないでください。これは、匿名オブジェクトを回避するのに役立ちます。

これはかなり簡単なはずです。

var stmt:SQLStatement = new SQLStatement();
    stmt.itemClass = Comment;
    stmt.text = 'SELECT * FROM comments WHERE title LIKE "@%search%";';
    stmt.parameters['@search'] = userInput.text;
    stmt.addEventListener(SQLEvent.RESULT, onResults);
    stmt.execute();
于 2012-06-07T22:25:53.987 に答える
0

文字列から :string を削除します。

次のようにうまく動作します。

SELECT * FROM comments WHERE comments.title LIKE '%string%';
于 2012-06-07T17:52:26.303 に答える