我正在尝试设置一个程序,当用户更新项目描述时,将在保存表单时更新数据库。我已经设置了我发现的所有必需的东西,但适配器永远不会更新。它选择并插入很棒但永远不会更新。代码如下:
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()
扩展程序是我建立的家庭brew扩展程序,用于检查表以查看是否存在值。它运行完美,并设置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
的方法。
答案 0 :(得分:0)
我弄清楚我做错了什么。我使用的是一个null
引用作为其原始行值的表,当SQLDataAdapter.Update()
运行时,它正在查找一个null
值的行,该行不存在,因此被忽略。为了解决这个问题,我改变了我的“Item”表逻辑,如下所示:
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);
此更改将传递给update方法的新表设置为将具有其中数据库值的内部DataTable
更新为新更新,然后使用它更新数据库并使其正常工作。
希望这可以帮助那些可能最终遇到同样问题的人。