我正在使用这样的记录ID(dirID是ID的数组)从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
问题在于它并不总是从数据库中删除,并且不会引发任何错误。
会有更好的删除方法吗?
这不是参数的工作方式。
如果您的IN列表为1, 2, 3,那么该命令将尝试删除ID等于的记录"1, 2, 3",即没有记录。因此不会引发任何错误,也不会删除任何记录,因为没有找到任何记录。因此,您还将发现您的代码仅在列表包含1个项目时才有效。
IN
1, 2, 3
"1, 2, 3"
解决方案:您必须构建删除查询(字符串操作),而不是使用参数。只是提防SQL注入。
更新
从您的代码,将是这样的:
Dim delcmd = "DELETE FROM directory WHERE id IN (" + Join(dirID, ",") + ")" Dim cmd As New SQLiteCommand(delcmd, conn)
而且没有参数调用。当心:我只是调整了您的代码,但是 它不是 SQL注入安全的。您应该阅读有关内容以及中有关该主题的内容。