更新网格视图时出错
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。
【讨论】:
以上是关于更新网格视图时出错的主要内容,如果未能解决你的问题,请参考以下文章