Удаление из базы данных sqlite с помощью IN - PullRequest
2 голосов
/ 22 июня 2011

Я удаляю из базы данных 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

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

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

1 Ответ

1 голос
/ 22 июня 2011

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

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

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

Обновление

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

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

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

...