更新网格视图时出错

时间:2014-01-06 12:27:22

标签: vb.net winforms datagridview

我已从两个表中填充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   修改过的行。

3 个答案:

答案 0 :(得分:1)

尝试将SqlCommandBuilder添加到您的代码中我认为它会修复此问题我没有尝试过但希望它能够正常运行:

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

答案 1 :(得分:1)

SqlDataAdapter是一个继承DbDataAdapter的类。如果您查阅MSDN或Visual Studio的Object Brower,您会看到从DbDataAdapter继承的每个类都有几个“Command”属性,如DeleteCommand,InsertCommand,UpdateCommand和SelectCommand。

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

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

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

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

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

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
祝你好运!

答案 2 :(得分:0)

由于您访问的数据是使用Join创建的,因此您的数据更新将无法更新。数据更新仅适用于简单表(没有像Joins这样的花哨的东西)。如果要使用此功能,则需要手动使用其他查询更新表,然后将表重新加载到datagridview。有关详情,请参阅this articlethis article