Vb.net 更新栅格视图时出错

Vb.net 更新栅格视图时出错,vb.net,winforms,datagridview,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,

我从两个表中填充了一个
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
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
但在gridview中编辑任何内容后,我单击了更新按钮,但此行出现错误da.update(dt1)

错误:

传递数据行集合时,更新需要有效的UpdateCommand 使用修改的行


由于您正在访问的数据是使用
连接创建的
,因此您的数据更新将无法更新它。数据更新只在简单的表上工作(没有像
连接这样的新奇事物)。如果希望这样做,则需要手动使用另一个查询更新表,然后将表重新加载到datagridview。有关更多信息,请参阅和。

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

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

SqlDataAdapter是继承DbDataAdapter的类。如果您咨询MSDN或Visual Studio的对象浏览器,您将看到从DbDataAdapter继承的每个类都有几个“命令”属性,如DeleteCommand、InsertCommand、UpdateCommand和SelectCommand

请登录MSDN以扩展您对类属性的了解

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

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

请在MSDN中查看一些生成更新命令的示例

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

 da = New SqlDataAdapter
        Dim dt1 As DataTable = DirectCast(gv.DataSource, DataTable)
        da.Update(dt1)
        gv.DataSource = dt1
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

祝你好运

此行中获取错误:da.UpdateCommand=new SqlCommandBuilder(da).GetUpdateCommand(),错误=>需要初始化DataAdapter.SelectCommand属性。请尝试不重新初始化
da
从某种意义上重新初始化?此行中获取错误::da.Update(dt1):对多个基表不支持动态SQL生成。先生,我没有将@cid(company id)值填充到我的GridView中。您应该将其作为隐藏列包含,为了正确更新数据库中相应的行。在按钮中,单击如何识别GridView中更新的列执行UpdateCommand以更新CommandText中指定的整行,而不仅仅是特定列。但是,始终可以使用
OnCellEndEdit
事件捕获特定单元格编辑。看看这个: