当 RowState = Modified 时 SQLDataAdapter.Update() 不更新
Posted
技术标签:
【中文标题】当 RowState = Modified 时 SQLDataAdapter.Update() 不更新【英文标题】:SQLDataAdapter.Update() not Updating when RowState = Modified 【发布时间】:2018-05-15 16:41:39 【问题描述】:我正在尝试设置一个程序,当用户更新项目描述时,将在保存表单时更新数据库。我已经设置了我发现所需的所有内容,但适配器从未更新。它选择和插入很棒,但从不更新。代码如下:
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
的方法。
【问题讨论】:
【参考方案1】:我发现我做错了什么。我正在使用一个具有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
更新为新的更新,然后使用它来更新数据库并且它正常工作。
希望这可以帮助任何可能最终遇到与我相同的问题的人。
【讨论】:
以上是关于当 RowState = Modified 时 SQLDataAdapter.Update() 不更新的主要内容,如果未能解决你的问题,请参考以下文章
在不更改原始 RowState 的情况下对数据集中的数据表进行排序
DataGridViewComboBoxColumn 值更改不会将 RowState 更改为已修改
dynamics ax 2012:将 RowState 从 Edit 更改为 Selected