Я пытаюсь настроить программу, которая, когда пользователь обновляет описание элемента, будет обновлять базу данных при сохранении формы.Я установил все, что нашел, что требуется, и все же адаптер никогда не обновляется.Он выбирает и вставляет отлично, но никогда не обновляется.Введите следующий код:
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 не существует, в Added.
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
после внесения изменений в базу данных.