【问题标题】:System.InvalidOperationException: Error on updating the table through datagridview using dt.update methodSystem.InvalidOperationException:使用 dt.update 方法通过 datagridview 更新表时出错
【发布时间】:2014-03-17 14:08:55
【问题描述】:

我在单击按钮通过数据网格视图更新表格时遇到问题。 这是我的代码。

Public Sub loaddgvfrm3()
    cmdconn = New SqlConnection
    cmd = New SqlCommand
    cmdconn.ConnectionString = sqlstr
    cmdconn.Open()
    cmd.Connection = cmdconn
    cmd.CommandText = "select  period, VOUCH_AMT, INDIVIDUAL_AMT, check_no, D_MAILED, DIR_NO, who_updated, year_student from tobee.EBD_BILLHISTORY where CLAIM_NO like '" + txtClaimno.Text + "'"
    'cmd.CommandText = "select  a.period, a.VOUCH_AMT, a.INDIVIDUAL_AMT, a.check_no, a.bal_ent, a.D_MAILED, a.DIR_NO from tobee.EBD_BILLHISTORY a left join carlos.claims_waivee b on a.CLAIM_NO = b.claim_no where b.CLAIM_NO like '" + claimno.ToString + "'"

    'Dim ds As New DataTable
    'Dim cmdbuilder = New SqlCommandBuilder(da)
    'da = New SqlDataAdapter()
    da.SelectCommand = cmd

    da.Fill(dt)
    Me.DataGridView1.DataSource = dt
    Me.DataGridView2.DataSource = dt
    cmdconn.Close()

End Sub

上面的代码是我放置选择语句的 datagridview 内容。我现在正在修改那个datagridview

Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click



    Try

        cmdBuilder = New SqlCommandBuilder(da)
        da.Update(dt)
        dt.AcceptChanges()
        'End If
        MsgBox("changes done")

    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

每当我修改某一行后点击保存按钮,就会出现错误日志,

错误看起来像这样:

System.InvalidOperationException:不支持不返回任何键列信息的 SelectCommand 为 UpdateCommand 生成动态 SQL。 在 system.data.common.dbdataadapter.updatingrowstatusErrors(RowUpdatingeventArgs rowUpdatedEvent,DataRow 数据行) 在 System.data.Common.DbDataAdapter.UpdateFromDataTable(DataTable 数据表,DataTableMapping 表映射) 在 System.Data.Common.DataAdapter.Update(DataTable 数据表) 在 Educational.frmEb.btnSave_Click(object Sender, EventArgs e) 中 C:\Users\Fox\Documents\Stress Test\Educational\form3.vb:line 220

但程序仍在继续。 我看不到我在 DGV 中对数据库所做的任何更改。 有什么我遗漏的吗?

这是我的声明

Dim connstr As String = "server=midtelephone\sqlexpress; database=testdb; user= sa; password=sa;"
Dim cmdconn = New SqlConnection
Dim cmdBuilder As SqlCommandBuilder
Dim da As New SqlDataAdapter()
Dim dt As New DataTable

在那个错误之前,他们说我需要在数据库中设置一个主键/唯一键,所以我做了,但出现了同样的错误。

请帮助我,我真的停留在这个阶段,如果你这样做,我将永远感激不尽,因为这是我项目的最后一部分。使用 da.update 更新我从 dgv 到数据库所做的更改。

【问题讨论】:

  • 这将有助于显示有问题的数据库表,但我的感觉是它没有主键
  • 我确实在所选表上创建了主键,但出现了同样的错误。
  • 我在 SqlDataAdapter 上没有看到你的 SelectCommand,请显示这个
  • 那里'我更新了我的帖子。

标签: sql vb.net datagridview datatable dataadapter


【解决方案1】:

命令生成器只能在以下情况下生成 UpdateCommand 和 DeleteCommand:

  1. SelectCommand 查询单个表。
  2. 该表有一个主键。
  3. 数据适配器知道该主键。

如果您已经转换了 1 和 2,请确保数据适配器的 MissingSchemaAction 属性设置为 AddWithKey。

【讨论】:

  • 在哪里可以找到 missingSchemaAction 属性?
  • 在您的 SqlDataAdapter 上。如果您说您的表确实有一个主键,那么这可能就是您要寻找的答案。
  • 是我的想象吗?我是否只是认为我输入了“数据适配器的 MissingSchemaAction 属性”而我没有真正输入?即使我没有,你的 IDE 上的帮助菜单是否坏了?
  • 是的,你可能输入了它,老实说,这是我第一次使用这个 Visual Studio。现在你知道我对这个平台有多陌生了。 :(
  • 我做了 3,但出现了另一个错误:System.argumentOutOfrangeException:missingmappingaction 枚举值 4 无效。参数名称:MissingMappingACtion
猜你喜欢
  • 2012-02-20
  • 2014-03-03
  • 2021-08-02
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
相关资源
最近更新 更多