Sql server 如何使用vb.net更新datagridview中已删除的行

Sql server 如何使用vb.net更新datagridview中已删除的行,sql-server,vb.net,datagridview,Sql Server,Vb.net,Datagridview,我是vb.net的初学者。最近我在datagridview上遇到了一个非常奇怪的问题。 这是我的密码: Public Class testing Dim bm As BindingManagerBase Dim dt As DataTable Dim dr As DataRow Private Sub testing_Load(sender As Object, e As EventArgs) Handles MyBase.Load OleDbDataAdapter1.Fill(Dat

我是vb.net的初学者。最近我在datagridview上遇到了一个非常奇怪的问题。 这是我的密码:

Public Class testing
Dim bm As BindingManagerBase
Dim dt As DataTable
Dim dr As DataRow

Private Sub testing_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    OleDbDataAdapter1.Fill(DataSet11)
    bm = Me.BindingContext(DataSet11, "calculatetable")
End Sub

Public Sub btnCalculate_Click(sender As Object, e As EventArgs) Handles btnCalculate.Click
    Dim a As Integer
    Dim max As Integer
    a = 0
    OleDbDataAdapter1.Update(DataSet11, "calculatetable")
    dt = DataSet11.Tables("calculatetable")
    max = dt.Rows.Count - 1
    For len As Integer = 0 To max
        dr = dt.Rows(len)
        a = dr("Number") + a
    Next
    Label1.Text = a
End Sub

Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
    dt = DataSet11.Tables("calculatetable")
    dr = dt.NewRow()
    dr(0) = TextBox1.Text
    dt.Rows.Add(dr)
End Sub

Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click
    dt = DataSet11.Tables("calculatetable")
    dr = dt.Rows.Find(TextBox1.Text)
    dr.Delete()
End Sub
End Class
实际上,我正在为我的出纳系统项目做一个计算表。我有一个文本框,用户可以输入在新行中添加新数据和删除所选行的编号。 在我的数据库中,我有一个名为calculatetable的表,还有一个名为Number的列,其中包含主键。 添加函数和删除函数都必须更新到数据库中。 添加功能似乎做得很好,但删除功能让我头疼。。。 我收到了以下错误消息:

"An unhandled exception of type 'System.Data.MissingPrimaryKeyException' occurred in System.Data.dll
Additional information: Table doesn't have a primary key."

我的编码有问题吗?还是说我错过了任何一个成功的部分?很抱歉我的英语不好:谢谢。

正如前面指出的,问题源于该表上没有主键。为了缓解这个问题,您可以轻松地定义主键列。定义列时,Rows.Find方法确切地知道要删除的行

您也可以使用DataTable.Select函数,该函数不带主键,但如果该数字位于另一行,则不会将其删除。例如:假设有3行Id为1、12、32。如果您使用select函数并希望从列表中删除12,那么它将不起作用,因为32中存在2

将主键添加到表中

您可以在加载时执行此操作,这样您的数据表就可以预先设置主键。当它显示YOURUNIQUECOLUMN时,您可以在这里指定唯一的列;通常是某种id列。完成此操作后,可以删除该行

 dr = DataSet11.Tables("calculatetable").Rows.Find(TextBox1.Text)

 If dr IsNot Nothing Then
  DataSet11.Tables("calculatetable").Rows.Remove(dr)
 End If 

看起来这可能是您的问题:假设您的表确实有一个主键,那么您可以从sql server中的表加载datatable,但不指定datatable的primarykey。请注意,Find方法的参数是datatable的键,但是由于没有指定主键,它将失败。你可能只需要看看上面贴的链接,从另一个角度找到你的那一排。@Villager A,看起来你可能是新来的。如果这个问题对你的问题有帮助,请通过勾选我的答案来标记这个答案,以便其他人知道这个问题已经得到了回答。谢谢
 dr = DataSet11.Tables("calculatetable").Rows.Find(TextBox1.Text)

 If dr IsNot Nothing Then
  DataSet11.Tables("calculatetable").Rows.Remove(dr)
 End If