如何在Adobe AIR中删除多行(使用命名参数)

时间:2011-01-31 03:50:28

标签: actionscript-3 sqlite air

我正在尝试删除Adobe AIR应用程序(运行时2.5)中sqlite表中的多行。

以下是使用“IN”运算符的语句:

"DELETE FROM mylist WHERE tdId IN (tdId1, tdId2, tdId3, ...)";

其中tdId1,tdId2等将在运行时根据用户选择删除的行确定。用户可以删除任意数量的行。

我尝试过类似的事情:

//delete statement text
"DELETE FROM mylist WHERE tdId IN :tdId";
//delete statement parameters: take 1. 
//Got "argument error: near ':tdId': syntax error"
deleteStmt.parameters[":tdId"] = "(26, 32)";
//delete statement parameters: take 2. 
//Also got "argument error: near ':tdId': syntax error"
var arr:Array = [26, 32];
deleteStmt.parameters[":tdId"] = arr;

我如何删除多行?

[编辑]所以看起来上面带有参数[“:tdId”]的缓存语句在删除多行时不起作用。当试图在异步模式下多次执行删除语句,在队列中的第一个行被删除后,闪存引发以下错误:

  

“错误#3110:操作不能   在SQLStatement.executing时执行   是的。“

使用回调链接这些删除似乎太麻烦了。所以我想我正在使用我的最后手段:在运行时构建sql。结论:缓存语句不能用于这种情况......

2 个答案:

答案 0 :(得分:0)

插入参数“(26,32)”时会出现问题。由于参数不是纯粹的值替换,它表示SQL的变量,而不是A STRING。因此,你的陈述有效地成为(或大致)你的第一次......

"DELETE FROM mylist WHERE tdId IN '(26,32)'"

因此你的错误,由于语法...在你的第二次采取它变得更糟......

"DELETE FROM mylist WHERE tdId IN *Array(26,32)*"

由于变量未转换为字符串值,因此实际上不会发生这种情况。但是当interprater(SQL)试图理解'IN'文本之后的代码时,它会得到一个ARRAY对象,它完全不知道该怎么做......它甚至不是一个有效的SQL类型。 ...

解决方案? [我尚未对其进行全面测试,请完成]

var toDel:Array = [26,32]
//delete statement text
var baseStr:String = "DELETE FROM mylist WHERE tdId IN (";
var midStr:String = '';
//delete statement parameters: Processing parameter
for( var i = 0; i < toDel.length; i++ ) {
    deleteStmt.parameters[i] = toDel[i];
    if(midStr.length > 0) { midStr += ' , '; }
    midStr += '?';
}
deleteStmt.text = baseStr + midStr + ' )';
//Then execute

所以在这种情况下会发生的是你有效地执行......

"DELETE FROM mylist WHERE tdId IN ( :val1 , :val2 )"

通过这种方式,您仍然可以保持参数的安全(良好实践)使用,而无需将所有内容转换为字符串。

编辑:如果你不明白参数/'?'的使用参考: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/data/SQLStatement.html#parameters

答案 1 :(得分:0)

如果IN子句不允许参数,您可以尝试使用旧式SQL样式:追加多个

  

&#34;或(tdId =:param&#34; + paramCounter.toString()+&#34;)&#34;

到SQL字符串