【问题标题】:Getting an error while updating the grid view更新网格视图时出错
【发布时间】:2014-01-06 12:27:22
【问题描述】:

我已经从两个表中填充了DataGridView

在页面加载事件中我有这个代码:

Dim da As New SqlDataAdapter
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Using adapter As SqlDataAdapter = New SqlDataAdapter("select c.CompanyName,d.dtName,d.dtPhone,d.dtEmail  from CompanyMaster_tbl c join  DepartmentMaster_tbl d on c.Cid=d.cId", con.connect)
    Dim dt As DataTable = New DataTable()
    adapter.Fill(dt) 
    gv.DataSource = dt
  End Using
End Sub

在更新按钮中单击我给出的代码如下:

 da = New SqlDataAdapter
        Dim dt1 As DataTable = DirectCast(gv.DataSource, DataTable)
        da.Update(dt1)
        gv.DataSource = dt1

但在 gridview 中编辑任何内容后,我单击更新按钮,但在这一行中出现错误 da.Update(dt1)

错误:

在传递 DataRow 集合时,更新需要有效的 UpdateCommand 修改后的行。

【问题讨论】:

    标签: vb.net winforms datagridview


    【解决方案1】:

    SqlDataAdapter 是一个继承 DbDataAdapter 的类。如果您查阅 MSDN 或 Visual Studio 的 Object Brower,您会发现从 DbDataAdapter 继承的每个类都有多个“命令”属性,例如 DeleteCommand、InsertCommand、UpdateCommand 和 SelectCommand。

    请查看 MSDN 中的SqlDataAdapter (Class) 以扩展您对类属性的了解。

    这些属性用于与您的数据库交互。例如,如果您插入了一个新的公司或部门,则将在数据库上执行 InsertCommand 以将其插入,但如果您更新了特定公司或部门的任何字段,则将使用 UpdateCommand。

    正如我在您发布的代码中看到的那样,您正在使用与两个表相关的 DataGridView,这使得构建propper UpdateCommand 变得更加困难,因为您必须为用户的每个公司或部门更新两个表修改。

    请查看 MSDN 中的 DbDataAdapter.UpdateCommand (Property) 以查看一些构建更新命令的示例。

    您需要分别执行两个 UpdateCommand,每个表一个,如下所示:

    UPDATE CompanyMaster_tbl
    SET    c.CompanyName = @CompanyName
    WHERE    c.Cid= @Cid
    
    UPDATE DepartmentMaster_tbl
    SET    d.dtName = @dtName,
           d.dtPhone = @dtPhone,
           d.dtEmail = @dtEmail
    WHERE  d.cId = @Cid
    

    祝你好运!

    【讨论】:

    • 先生,我没有将 @cid(company id) 值填充到我的 gridview 中
    • 您应该将其作为隐藏列包含,以便正确更新数据库中的相应行。
    • 在按钮中单击我如何​​识别gridview中更新了哪一列
    • 执行 UpdateCommand 以更新 CommandText 上指定的整行,而不仅仅是特定列。
    • 但是,您始终可以使用OnCellEndEdit 事件来捕获特定的单元格编辑。看看这个:DataGridView.OnCellEndEdit (Method)
    【解决方案2】:

    尝试将SqlCommandBuilder 添加到您的代码中,我认为它会解决此问题我没有尝试过,但希望它会起作用:

        dim cd as SqlCommandBuilder = new SqlCommandBuilder(da)
        Dim dt1 As DataTable = DirectCast(gv.DataSource, DataTable)
        da.Update(dt1)
        gv.DataSource = dt1
    

    【讨论】:

    • 在这一行出现错误:da.UpdateCommand = new SqlCommandBuilder(da).GetUpdateCommand(),Error=>DataAdapter.SelectCommand 属性需要初始化。
    • 尽量不要重新初始化da
    • 某种意义上的重新初始化?
    • 在这一行出现错误::da.Update(dt1) : 不支持对多个基表进行动态 SQL 生成。
    【解决方案3】:

    由于您正在访问的数据是使用Join 创建的,因此您的数据更新将无法更新它。数据更新只适用于简单的表(没有像Joins 这样的花哨的东西)。如果您想让它工作,您需要手动使用另一个查询更新表,然后将表重新加载到 datagridview。有关详细信息,请参阅this articlethis article

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多