更新网格视图时出错

Posted

技术标签:

【中文标题】更新网格视图时出错【英文标题】: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 修改后的行。

【问题讨论】:

【参考方案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 article 和 this article。

【讨论】:

以上是关于更新网格视图时出错的主要内容,如果未能解决你的问题,请参考以下文章

ng-class 在值更改时未正确更新

获取 QGraphicsView 的更新大小

在 vb.net 中更新后刷新数据网格视图

单击特定网格视图单元格时淡出网格视图

刷新数据网格视图

开发图库视图时 setAdapter 出错 [重复]