0

我正在尝试设置一个程序,当用户更新项目描述时,将在保存表单时更新数据库。我已经设置了我发现所需的所有内容,但适配器从未更新。它选择和插入很棒,但从不更新。代码如下:

  internal void UpdateDB(DataTable Items)
    {
      using ( var ItemsAdapter = new SqlDataAdapter("select * from dbo.Items", Properties.Settings.Default.ConnectionString) )
      using ( var ItemsCB = new SqlCommandBuilder(ItemsAdapter) )
      {
        ItemsAdapter.UpdateCommand = ItemsCB.GetUpdateCommand(true);
        ItemsAdapter.InsertCommand = ItemsCB.GetInsertCommand(true);
        ItemsAdapter.DeleteCommand = ItemsCB.GetDeleteCommand(true);

        ItemsAdapter.AcceptChangesDuringUpdate = true;
        foreach ( DataRow Row in Items.AsEnumerable() )
        {
          if ( !_Items.TableContains("Item", Row["Item"]) )
          { Row.AcceptChanges(); Row.SetAdded(); }
          else if ( _Items.TableContains("Item", Row["Item"]) )
          { Row.AcceptChanges(); Row.SetModified(); }
        }
        ItemsAdapter.Update(Items);

        _LoadAll();
      }
    }

.TableContains()扩展是我构建的一个自制扩展,用于检查表以查看值是否存在。它运行完美,并将 PK 已存在的行设置为已修改,将 PK 不存在的行设置为已添加。

public static bool TableContains(this DataTable DT, string ColumnName, object ItemtoCheck)
{
  return DT.AsEnumerable()
           .Select(r => r.Field<string>(ColumnName))
           .ToList()
           .FindIndex(x => x.Equals(ItemtoCheck.ToString(), StringComparison.OrdinalIgnoreCase)) != -1;
}

_LoadAll();方法只是在DataTables对数据库进行更改后重新加载所有内容的方法。

4

1 回答 1

0

我弄清楚我做错了什么。我正在使用一个具有null引用作为其原始行值的表,并且在SQLDataAdapter.Update()运行时它正在寻找具有null不存在的值的行,因此被忽略了。为了解决这个问题,我改变了我的“项目”表逻辑如下:

    ItemsAdapter.AcceptChangesDuringUpdate = true;
    foreach ( DataRow Row in Items.AsEnumerable() )
    {
      if ( !_Items.TableContains("Item", Row["Item"]) )
      { ItemsTable.Rows.Add(Row); }
      else if ( _Items.TableContains("Item", Row["Item"]) )
      {
        ItemsTable.AsEnumerable()
                  .Join(Items.AsEnumerable(), r1 => r1.ItemArray[0], r2 => r2.ItemArray[0], (r1, r2) => new { r1, r2 })
                  .ToList()
                  .ForEach(i => i.r1.SetField(1, i.r2.ItemArray[1]));
      }
    }
    ItemsAdapter.Update(ItemsTable);

此更改将传递给更新方法的新表设置为将DataTable其中包含数据库值的内部更新为新更新,然后使用它来更新数据库并且它正常工作。

希望这可以帮助任何可能最终遇到与我相同的问题的人。

于 2018-05-15T18:28:32.433 回答