【问题标题】:How to delete multiple rows (using named parameters) in Adobe AIR如何在 Adob​​e AIR 中删除多行(使用命名参数)
【发布时间】:2011-01-31 03:50:27
【问题描述】:

我正在尝试在我的 Adob​​e 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;

如何删除多行?

[Edit] 所以看起来前面提到的带有参数 [":tdId"] 的缓存语句在删除多行时不起作用。当尝试在异步模式下多次执行delete语句时,队列中的第一行被删除后,Flash会抛出以下错误:

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

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

【问题讨论】:

  • 作为最后的手段,您可以在运行时使用所有这些 id 格式化查询字符串。

标签: actionscript-3 sqlite air


【解决方案1】:

当您插入参数“(26,32)”时会出现问题。由于参数不是纯粹的值替换,它表示 SQL 的变量,而不是字符串。因此,您的陈述实际上成为(或大致)在您的第一次拍摄中......

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

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

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

由于变量不会转换为字符串值,因此实际上不会发生这种情况。但是发生的情况是,当解释器 (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

【讨论】:

    【解决方案2】:

    如果IN子句不允许参数,你可以试试老派的SQL风格:追加多个

    " OR (tdId = :param" + paramCounter.toString() + ")"

    到 SQL 字符串

    【讨论】:

      猜你喜欢
      • 2012-06-11
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2012-01-25
      相关资源
      最近更新 更多