在调用"填充"问题之前,SelectCommand 属性尚未初始化:
Private Sub DeleteButton_Click(sender As Object, e As EventArgs) Handles DeleteButton.Click
Dim tables As DataTableCollection
Dim source1 As New BindingSource
Dim row As New Integer
Try
ds = New DataSet
tables = (ds.Tables)
da = New OleDbDataAdapter
da.Fill(ds, "Booking")
Dim cmdstr As String = "delete * from [Booking] where ID = " & DataGridView1.SelectedRows(0).Cells(0).Value.ToString()
Dim cmd As New OleDbCommand(cmdstr, objCon)
da.SelectCommand = cmd
objCon.Open()
cmd.ExecuteNonQuery()
objCon.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
更改
da.SelectCommand = cmd
跟
da.DeleteCommand = cmd
在代码开头重新保护Dim
语句;你从不在代码中使用表、source1 或行,所以声明它们是没有意义的。
转到Try
您为 ds 分配一个New DataSet
。这是空的,因此将 Tables 集合分配给表毫无意义。这也将是空的。
接下来,创建一个New DataAdapter
。新的数据适配器没有选择命令,因此它将无法.Fill
任何内容。
然后,将删除命令分配给数据适配器的 SelectCommand 属性。这是没有道理的。
最后你执行你的命令。如果不是其他代码,这应该有效。
将数据库对象保留在本地,以便可以控制它们的关闭和释放。Using...End Using
会为您处理这个问题。Using 还充当 Dim 语句,因此它还声明变量。您可以通过用逗号分隔多个变量来在单个 Using 中包含多个变量。
我猜到了你ID字段的数据类型。检查您的数据库。
Private Sub DeleteButton_Click(sender As Object, e As EventArgs) Handles DeleteButton.Click
Try
Using cn As New OleDbConnection("Your connection string"),
cmd As New OleDbCommand("delete * from [Booking] where ID = @ID", cn)
cmd.Parameters.Add("@ID", OleDbType.Integer).Value = DataGridView1.SelectedRows(0).Cells(0).Value
cn.Open()
cmd.ExecuteNonQuery()
End Using
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub