VB SQL DELETE 语句不起作用 - 完全没有错误
VB SQL DELETE Statement Not Working - No Error At All
这是我的代码,但它不起作用,我试图让它删除列 staffID 等于变量 currentStaffID 的记录,尽管它不会删除记录或给出错误,它只是在 DELETE 语句之后继续并显示 MsgBox。
Dim AreYouSureEdit = MsgBox("Are you sure you want to delete this record?", MsgBoxStyle.YesNo)
If DbConnect() And AreYouSureEdit = MsgBoxResult.Yes Then
Dim SQLCmd As New OleDbCommand
SQLCmd.Connection = cn
currentStaffID = editStaffIDTxtBox.Text()
SQLCmd.CommandText = "DELETE * STAFF WHERE staffID = @currentStaffID"
cn.Close()
MsgBox("Record Deleted.", MsgBoxStyle.OkOnly)
End If
您正在设置命令和所有内容 - 但您永远不会执行它!当然什么也没有发生.....
您需要添加一行代码:
Dim SQLCmd As New OleDbCommand
SQLCmd.Connection = cn
currentStaffID = editStaffIDTxtBox.Text()
SQLCmd.CommandText = "DELETE * STAFF WHERE staffID = ?"
'' You need to define the parameter and set its value here!
SQLCmd.Parameters.Add("p1", OleDbType.Int).Value = currentStaffID;
'' you need to actually **EXECUTE** your DELETE query!
SQLCmd.ExecuteNonQuery()
cn.Close()
此外,虽然您在 SQL 查询文本中设置了一个参数,但我没有看到您在 SQLCmd
对象上实际定义此类参数的位置 -还要注意:OleDB 不使用 named 参数(就像本机 SQL 服务器客户端那样)——它使用 positional 参数(这就是我用 ?
替换您的命名参数的原因)。由于只有一个参数,这应该不是问题 - 但您需要正确定义 SQLCmd
的参数(并设置其值)
连接和命令可以使用非托管资源,因此需要调用它们的 .Dipose
方法来释放这些资源。 Using...End Using
块负责处理此问题以及 .Close
连接。您的数据库对象必须是使用它们的方法的本地对象。
始终使用参数以避免Sql注入。
Private Sub OpCode()
Dim AreYouSureEdit = MsgBox("Are you sure you want to delete this record?", MsgBoxStyle.YesNo)
If AreYouSureEdit = MsgBoxResult.Yes Then
Using cn As New OleDbConnection("Your connection string"),
SQLCmd As New OleDbCommand("DELETE From STAFF WHERE staffID = @currentStaffID", cn)
SQLCmd.Parameters.Add("@currentStaffID", OleDbType.Integer).Value = CInt(editStaffIDTxtBox.Text)
cn.Open()
SQLCmd.ExecuteNonQuery()
End Using
MsgBox("Record Deleted.", MsgBoxStyle.OkOnly)
End If
End Sub
这是我的代码,但它不起作用,我试图让它删除列 staffID 等于变量 currentStaffID 的记录,尽管它不会删除记录或给出错误,它只是在 DELETE 语句之后继续并显示 MsgBox。
Dim AreYouSureEdit = MsgBox("Are you sure you want to delete this record?", MsgBoxStyle.YesNo)
If DbConnect() And AreYouSureEdit = MsgBoxResult.Yes Then
Dim SQLCmd As New OleDbCommand
SQLCmd.Connection = cn
currentStaffID = editStaffIDTxtBox.Text()
SQLCmd.CommandText = "DELETE * STAFF WHERE staffID = @currentStaffID"
cn.Close()
MsgBox("Record Deleted.", MsgBoxStyle.OkOnly)
End If
您正在设置命令和所有内容 - 但您永远不会执行它!当然什么也没有发生.....
您需要添加一行代码:
Dim SQLCmd As New OleDbCommand
SQLCmd.Connection = cn
currentStaffID = editStaffIDTxtBox.Text()
SQLCmd.CommandText = "DELETE * STAFF WHERE staffID = ?"
'' You need to define the parameter and set its value here!
SQLCmd.Parameters.Add("p1", OleDbType.Int).Value = currentStaffID;
'' you need to actually **EXECUTE** your DELETE query!
SQLCmd.ExecuteNonQuery()
cn.Close()
此外,虽然您在 SQL 查询文本中设置了一个参数,但我没有看到您在 SQLCmd
对象上实际定义此类参数的位置 -还要注意:OleDB 不使用 named 参数(就像本机 SQL 服务器客户端那样)——它使用 positional 参数(这就是我用 ?
替换您的命名参数的原因)。由于只有一个参数,这应该不是问题 - 但您需要正确定义 SQLCmd
的参数(并设置其值)
连接和命令可以使用非托管资源,因此需要调用它们的 .Dipose
方法来释放这些资源。 Using...End Using
块负责处理此问题以及 .Close
连接。您的数据库对象必须是使用它们的方法的本地对象。
始终使用参数以避免Sql注入。
Private Sub OpCode()
Dim AreYouSureEdit = MsgBox("Are you sure you want to delete this record?", MsgBoxStyle.YesNo)
If AreYouSureEdit = MsgBoxResult.Yes Then
Using cn As New OleDbConnection("Your connection string"),
SQLCmd As New OleDbCommand("DELETE From STAFF WHERE staffID = @currentStaffID", cn)
SQLCmd.Parameters.Add("@currentStaffID", OleDbType.Integer).Value = CInt(editStaffIDTxtBox.Text)
cn.Open()
SQLCmd.ExecuteNonQuery()
End Using
MsgBox("Record Deleted.", MsgBoxStyle.OkOnly)
End If
End Sub