我正在使用这样的记录 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
问题是它并不总是从数据库中删除,并且不会抛出任何错误。
有没有更好的删除方法?
参数不是这样工作的。
If your IN
清单是1, 2, 3
,该命令正在尝试删除 ID 等于的记录"1, 2, 3"
,没有。因此不会引发错误,也不会删除任何记录,因为没有找到任何记录。因此,您还会发现您的代码仅在列表包含 1 项时才有效。
解决方案:您必须构建删除查询(字符串操作),而不是使用参数。只是要小心SQL注入 http://en.wikipedia.org/wiki/SQL_injection.
Update
从你的代码来看,它会是这样的:
Dim delcmd = "DELETE FROM directory WHERE id IN (" + Join(dirID, ",") + ")"
Dim cmd As New SQLiteCommand(delcmd, conn)
并且没有参数调用。当心:我刚刚调整了你的代码,但是它不是SQL注入安全。您应该阅读有关此内容以及 StackOverflow 中有关该主题的文章。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)