我正在使用这样的记录的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
问题是它并不总是从数据库中删除,并且它不会抛出任何错误。
有没有更好的删除方式?
答案 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中有关该主题的内容。