18

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

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

当传递带有修改行的 DataRow 集合时,更新需要有效的 UpdateCommand。

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

有一个额外的StagingTableAdapter查询,它以“过滤器”作为参数。那是用来填充的DataGridView。在创建该查询的向导中,我看到“生成了更新”。我看到大多数带有此错误的帖子都需要使用命令生成器生成更新语句。我该怎么办?

4

11 回答 11

29

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

于 2011-06-13T17:05:22.170 回答
17

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

pseudocode:

DataAdapter da = new DataAdapter(...)
...
da.Fill();
da.UpdateCommand = new OracleCommandBuilder(da).GetUpdateCommand();
...
da.Update();
于 2009-07-30T21:15:32.837 回答
9

错误很明确:适配器需要有效的 SQL 更新语句。数据集设计器和 CommandBuilders 将为您生成这些,但手工编写一些 SQL 也没有错。

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

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

于 2009-02-25T23:42:33.793 回答
8

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

DataAdapter da = new DataAdapter(...)
...
da.Fill();
da.UpdateCommand = new SqlCommandBuilder(da).GetUpdateCommand();
...
da.Update();
于 2011-05-15T14:56:33.770 回答
3

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

当传递带有修改行的 DataRow 集合时,更新需要有效的 UpdateCommand。

然后我发现您还需要刷新表适配器(当您考虑它时才有意义!)。

在您执行此操作时,可能还值得仔细检查您是否选择了“生成插入、更新和删除语句”选项(如下所示)。

在此处输入图像描述

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

在此处输入图像描述

于 2018-08-31T15:31:19.903 回答
2

我刚刚遇到了同样的问题,Jason 的回答确实对我有用:我忘记为我的表分配主键。

再补充一个提醒:纠正表中的问题后,返回 Visual Studio 时,在包含数据集的 .xsd 文件中,确保删除原始表并从服务器资源管理器或数据库中重新添加探险家。否则错误仍然存​​在。

于 2014-06-02T11:28:40.393 回答
1

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

于 2016-12-20T08:15:03.200 回答
0

从页面:

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

所以据我所知,这些语句应该已经生成了。我正在使用一张桌子。

于 2009-02-26T17:56:40.590 回答
0

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

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());           
    }
}
于 2015-02-24T13:00:18.400 回答
0

您可以对任何表使用以下代码,它会自动为您生成插入、更新和删除命令。

private void savechanges(String tbl, SqlDataAdapter sqldap, DataSet dset)
    {

        try
        {
            SqlCommandBuilder scb = new SqlCommandBuilder(sqldap);
            scb.ConflictOption = ConflictOption.CompareRowVersion;
            sqldap.Update(dset, tbl);
            dset.AcceptChanges();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString());
        }
    }
于 2021-04-23T02:03:17.750 回答
-1

您所要做的就是编辑数据库并确保至少有一列被标识为 Primary Key

在我的简单示例中,这可能是名称列——尽管更实际地我会添加一个自动编号的标识列,以确保该列中的所有值都是唯一的。

重新保存所有内容,重新创建一个新的 DataSet, 像以前一样使用拖放替换 DataGridView ,一切顺利。

像往常一样,当你知道答案时,答案很简单——当你不知道时,会非常沮丧。

来源

于 2019-02-11T13:02:35.437 回答