Как удалить несколько строк (используя именованные параметры) в Adobe AIR - PullRequest
1 голос
/ 31 января 2011

Я пытаюсь удалить несколько строк в таблице sqlite в моем приложении Adobe AIR (среда выполнения 2.5).

Вот оператор, использующий оператор «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"] не работает при удалении нескольких строк.При попытке выполнить оператор удаления несколько раз в асинхронном режиме после удаления самой первой строки в очереди Flash выдает следующую ошибку:

"Ошибка # 3110: Операция не может быть выполнена во время выполнения SQLStatement.executing имеет значение true. "

Казалось бы, слишком много проблем, чтобы связать эти удаления с обратным вызовом.Так что я полагаю, что я использую свое последнее средство: создание sql во время выполнения.Вывод: кэшированные операторы нельзя использовать в подобных ситуациях ...

Ответы [ 2 ]

0 голосов
/ 21 июля 2011

Если предложение IN не разрешает параметры, вы можете попробовать стиль старой школы SQL: добавить несколько

"ИЛИ (tdId =: param" + paramCounter.toString () + ")"

в строку SQL

0 голосов
/ 11 июня 2011

Проблема возникает при вставке параметра "(26,32)".Поскольку параметр не является просто подстановкой значения, он представляет переменную для SQL, а НЕ STRING.Следовательно, ваше утверждение фактически стало (или примерно) в вашем первом дубле ...

"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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...