在传递带有已修改行的DataRow集合时,Update需要有效的UpdateCommand

所以我上周有这个工作。 至少,我以为我做到了! DataGridView更新

然后我今天又开始研究这个项目了

在传递带有已修改行的DataRow集合时,Update需要有效的UpdateCommand。

scDB.SSIS_Configurations_StagingDataTable table = (scDB.SSIS_Configurations_StagingDataTable)stagingGrid.DataSource; myStagingTableAdapter.Update(table); 

StagingTableAdapter有一个额外的查询,它将’filter’作为参数。 那用于填充DataGridView 。 在创建该查询的向导中,我看到“生成了更新”。 我发现大多数有此错误的post都要求使用命令构建器生成更新语句。 我该怎么办?

该错误非常直观:适配器需要有效的SQL Update语句。 数据集设计者和CommandBuilders会为你生成这些,但手工制作一些SQL也没有错。

无论如何,您必须validation(调试器)仍然配置了Update语句以及它实际上是什么。 它可能更像是SQL而不是C#问题。

编辑:Command Builder工具只处理直接,单表,Select语句。 使用加入或任何花哨的东西,你自己。

当您没有在要更新的表上定义主键时,也会显示此消息。

我和Sam遇到了同样的问题。 我有突然不再工作的工作代码。 我不知道什么时候写它,但它必须自动推断更新命令,然后停止这样做。 也许MS之间的服务包在我们从未注意到的版本之间。 无论如何,我遇到的解决方案是使用(在我的情况下为oracle)OracleCommandBuilder,它将DataAdapter(在调用fill之后)作为构造函数的参数,然后调用GetUpdateCommand()并将其分配给DataAdapter上的UpdateCommand。

 pseudocode: DataAdapter da = new DataAdapter(...) ... da.Fill(); da.UpdateCommand = new OracleCommandBuilder(da).GetUpdateCommand(); ... da.Update(); 

Dan的解决方法适用于我,但我可以使用SqlCommandBuilder而不是OracleCommandBuilder:

 DataAdapter da = new DataAdapter(...) ... da.Fill(); da.UpdateCommand = new SqlCommandBuilder(da).GetUpdateCommand(); ... da.Update(); 

我刚刚遇到了同样的问题,Jason的回答对我有用:我忘了给我的桌子分配一把主键。

还有一个提醒要添加:在更正表中的问题后,当回到Visual Studio时,在包含数据集的.xsd文件中,确保删除原始表并从服务器资源管理器或数据库中再次添加它资源管理器。 否则错误仍然存​​在。

您应始终具有主键定义的列字段。 否则问题将永远存在。 如果您没有主键字段,SqlCommandBuilder将无法帮助您。

我也遇到了同样的问题并得到了以下解决方案。 试试吧。

 private void btnSave_Click(object sender, EventArgs e) { ConnStr = "Data Source=FIN03;Initial Catalog=CmsTest;Integrated Security=True"; cn = new SqlConnection(ConnStr); cn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = cn; mytran = cn.BeginTransaction(IsolationLevel.Serializable ); cmd.Transaction = mytran; try { scb = new SqlCommandBuilder(da); da.Update(ds, "tblworker"); mytran.Commit (); MessageBox.Show("Data update successfully"); } catch (Exception err) { mytran.Rollback(); MessageBox.Show(err.Message.ToString()); } } 

从页面:

注意如果主查询中有足够的信息,则在生成TableAdapter时,默认情况下会创建InsertCommand,UpdateCommand和DeleteCommand命令。 如果TableAdapter的主查询不只是单个表SELECT语句,则设计器可能无法生成InsertCommand,UpdateCommand和DeleteCommand。 如果未生成这些命令,则在执行TableAdapter.Update方法时可能会收到错误。

因此,从我所知,这些陈述应该已经生成。 我正在使用一张桌子。

正如其他人所说,您需要确保在表上设置了主键,以便创建自动生成的更新代码。 我做了这个,但仍然看到相同的消息

在传递带有已修改行的DataRow集合时,Update需要有效的UpdateCommand。

然后我发现你需要刷新表适配器(当你想到它时才有意义!)。

在执行此操作时,可能需要仔细检查是否已选中“ 生成插入,更新和删除语句”选项(如下所示)。

在此处输入图像描述

然后只需单击向导,最终屏幕应确认它将创建重做所需的代码(现在使用主键):

在此处输入图像描述