2

我想在 LIKE 运算符模式中使用命名参数占位符,以便正确转义参数字符串。

这是我使用 at-param 占位符的修改后的代码:

var stmt = new air.SQLStatement();

stmt.text = "SELECT * FROM comments WHERE title LIKE '%@search%';";

stmt.parameters["@search"] = "参数字符串";

stmt.execute();

这样做会产生带有以下详细信息的 SQLError

消息:错误 #3315:SQL 错误。

详细信息:在参数属性中找到“@search”参数名称,但在指定的 SQL 中没有

正如 Mike Petty 所建议的,我尝试了:

stmt.text = 'SELECT * FROM comments WHERE title 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

从你的字符串中删除你的 :string 。

就像工作一样好:

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

从您的问题很难判断,但是您当前的语句是抛出 SQLError,只是不编译,还是不返回任何结果?

如果我不得不猜测我会说你在这里有一些问题:

  1. 您不必限定 where 子句中的列,因为您只有 1 个表可供选择
  2. 参数字符串在技术上是 AIR / Actionscript 的保留字(尽管大小写不同) - 仍然有点混乱。

尽管文档和代码允许您使用冒号或 at-symbol,但我更喜欢使用 @,因为它更容易看到 ;)

不要忘记为行添加您期望的类的 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 回答