Удаление из базы данных sqlite с помощью IN

Я удаляю из базы данных sqlite, используя идентификаторы таких записей (dirID - это массив идентификаторов):

Dim i As Integer = 0
        Dim conn As New SQLiteConnection("Data Source=" & DBPath)

        Dim cmd As New SQLiteCommand("DELETE FROM directory WHERE id IN (@ID)", conn)
        cmd.Parameters.AddWithValue("@ID", Join(dirID, ","))
        'conn.SetPassword(dbPassword)
        conn.Open()
        Try

            mytransaction = conn.BeginTransaction()
            '// delete directory //
            If dirID IsNot Nothing Then
                cmd.ExecuteNonQuery()
            End If

            mytransaction.Commit()
            conn.Close()

        Catch ex As Exception
            mytransaction.Rollback()
            strLastError = ex.Message
            Debug.Print(strLastError)
        Finally
            cmd.Dispose()
            conn.Dispose()
        End Try

Проблема в том, что он не всегда удаляет из базы данных и не выдает никаких ошибок.

Может есть лучший способ удаления?


person Smith    schedule 22.06.2011    source источник


Ответы (1)


Это не то, как работают параметры.

Если ваш список IN равен 1, 2, 3, команда пытается удалить запись, в которой ID равен "1, 2, 3", то есть отсутствует. Таким образом, ошибка не выдается и никакая запись не удаляется, потому что ничего не найдено. Таким образом, вы также обнаружите, что ваш код работает только тогда, когда ваш список содержит 1 элемент.

Решение: вам нужно создать запрос на удаление (манипулирование строками) вместо работы с параметрами. Просто остерегайтесь инъекций SQL.

Обновить

Из вашего кода это будет примерно так:

Dim delcmd = "DELETE FROM directory WHERE id IN (" + Join(dirID, ",") + ")"
Dim cmd As New SQLiteCommand(delcmd, conn)

И без вызова параметров. Осторожно: я только что подправил ваш код, но он небезопасен для SQL-инъекций. Вы должны прочитать об этом и о том, что было написано на эту тему здесь, в StackOverflow.

person Adriano Carneiro    schedule 22.06.2011