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
事件捕获特定单元格编辑。看看这个: