admin

使用IN从sqlite数据库删除

sql

我正在使用这样的记录ID(dirID是ID的数组)从sqlite数据库中删除:

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

问题在于它并不总是从数据库中删除,并且不会引发任何错误。

会有更好的删除方法吗?


阅读 217

收藏
2021-06-07

共1个答案

admin

这不是参数的工作方式。

如果您的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注入安全的。您应该阅读有关内容以及中有关该主题的内容。

2021-06-07