使用IN从sqlite数据库中删除

时间:2011-06-22 15:13:21

标签: sql vb.net sqlite parameters sql-delete

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

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 个答案:

答案 0 :(得分:1)

这不是参数的工作原理。

如果您的IN列表为1, 2, 3,则该命令会尝试删除ID等于"1, 2, 3"的记录,该记录为无。因此,不会抛出任何错误,也不会删除任何记录,因为找不到任何记录。因此,您还会发现只有当您的列表包含1个项目时,您的代码才有效。

解决方案:您必须构建删除查询(字符串操作),而不是使用参数。请注意SQL Injection

<强>更新

从你的代码中,它会是这样的:

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

没有参数调用。注意:我只是调整了你的代码,但它不是 SQL注入安全。您应该阅读有关该内容以及StackOverflow中有关该主题的内容。