问题描述
这是我的代码,它不起作用,我试图使它删除一个记录,其中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不使用命名参数(就像本机SQL Server客户端一样)-它使用 positional 参数(因此我只用{{1}替换了命名参数})。由于只有一个参数,所以这里应该没问题-但您需要正确定义?
的参数(并设置其值)
连接和命令可以使用非托管资源,因此,它们需要调用其.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