【问题标题】:Update requires a valid InsertCommand when passed DataRow collection with new rows使用新行传递 DataRow 集合时,更新需要有效的 InsertCommand
【发布时间】:2011-05-05 13:27:30
【问题描述】:

我正在尝试向我的数据库添加一个新行。这是我的代码:

ds1 是我的数据集,da1 是我的数据适配器

        dRow = ds1.Tables["localitati"].NewRow();
        dRow[1] = aux1.Replace(" ", "").Replace("-", "").ToLower();
        dRow[2] = aux2.ToLower().Replace(" ", "");
        dRow[3] = aux1;
        dRow[4] = e.X;
        dRow[5] = e.Y;
        ds1.Tables["localitati"].Rows.Add(dRow);

        da1.Update(ds1, "localitati");

da1.update(ds1,"localitati");,程序停止并给我错误:“Update requires a valid InsertCommand when passed DataRow collection with new rows。”

与数据库的连接有效(我已从数据库中检索到信息)

有什么想法吗?

【问题讨论】:

    标签: c# database


    【解决方案1】:

    用于添加 DataRows:

    SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
    
    // add rows to dataset
    
    builder.GetInsertCommand();
    
    //Without the SqlCommandBuilder this line would fail
    adapter.Update(dataSet);
    

    解释:

    adapter.Update(dataset) 将尝试将dataset 中的更改保存到数据库中。它需要:

    1. InsertCommand(如果添加了DataRows
    2. DeleteCommand(如果 DataRows 被删除)
    3. UpdateCommand(如果 DataRows 被修改)

    您可以在adapter.Update() 行之前放置一个断点来检查您的adapter.InsertCommand 以查看它是否已设置。

    要设置它们,只需创建一个 SqlCommandBuilder 并触发 GetInsertCommand()GetDeleteCommand() 等。

    这应该可以解决错误:

    1. “当传递带有修改行的 DataRow 集合时,更新需要有效的更新命令。”或者
    2. “当传递带有新行的 DataRow 集合时,更新需要有效的插入命令。”等

    更多信息请见MSDN Link

    【讨论】:

      【解决方案2】:

      问题已解决;您的问题:

      dRow = ds1.Tables["localitati"].NewRow();
      dRow[1] = aux1.Replace(" ", "").Replace("-", "").ToLower();
      dRow[2] = aux2.ToLower().Replace(" ", "");
      dRow[3] = aux1;
      dRow[4] = e.X;
      dRow[5] = e.Y;
      ds1.Tables["localitati"].Rows.Add(dRow);
      
      da1.Update(ds1, "localitati");
      

      答案:

      您必须使用 commandBuilder。那是在你使用 dataAdapter 更新之前(或者在你创建 dataRow 之前)添加代码:

      SqlCommandBuilder cmdb = new SqlCommandBuilder(da);
      

      【讨论】:

        【解决方案3】:

        您必须为您的 DataAdapter 定义一个 InsertCommand

        http://www.codeproject.com/KB/database/relationaladonet.aspx

        【讨论】:

        • 我也为其他感兴趣的人找到了这个csharp.net-informations.com/dataadapter/…
        • 在这种情况下使用 DataAdapter 是没有意义的。这是一个纯粹的例子,说明什么是不正确的。未参数化的查询、无用的 DataAdapter、未关闭的连接、带 null 的字符串初始化——所有不应该存在于项目中的东西。
        【解决方案4】:
        dRow = ds1.Tables["localitati"].NewRow();
                dRow[1] = aux1.Replace(" ", "").Replace("-", "").ToLower();
                dRow[2] = aux2.ToLower().Replace(" ", "");
                dRow[3] = aux1;
                dRow[4] = e.X;
                dRow[5] = e.Y;
                ds1.Tables["localitati"].Rows.Add(dRow);
                SqlCommandBuilder scb = new SqlCommandBuilder(da);//just add this line
                da1.Update(ds1, "localitati");
        

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 2016-01-13
        • 2010-12-23
        • 2010-10-09
        • 1970-01-01
        • 2013-09-05
        • 2014-07-10
        • 2016-04-18
        • 1970-01-01
        相关资源
        最近更新 更多