2011-01-31 44 views
1

我想刪除我的Adobe AIR應用程序(運行時2.5)中的sqlite表中的多行。如何在Adobe AIR中刪除多行(使用命名參數)

下面是聲明,用「IN」操作符:

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

凡tdId1,tdId2等將在運行時根據其行(S)的用戶選擇刪除確定。用戶可以刪除任意數量的行。

我已經試過類似:

//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「]的緩存語句在刪除多行時不起作用。當試圖在異步模式下多次使用delete語句,在隊列中的第一個行被刪除後,閃存引發以下錯誤:

"Error #3110: Operation cannot be performed while SQLStatement.executing is true."

這似乎太麻煩鏈這些刪除了回電話。所以我想我正在使用我的最後手段:在運行時構建SQL。結論:緩存語句不能用於這種情況...

+0

作爲最後的手段,你可以格式查詢字符串與運行時的所有這些id。 – alxx 2011-01-31 11:15:02

回答

0

插入參數「(26,32)」時會出現問題。由於該參數不是純粹的值的替代,它代表了SQL的一個變量,而不是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

0

如果IN子句不允許的參數,你可以試試老派SQL風格:追加多

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

到SQL字符串