2015-02-15 7 views
0
usersTableAdapter usersTA = new usersTableAdapter(); 
var usersTable = new users.usersDataTable(); 
usersTA.Fill(usersTable); 

VK_BDayParser.users.usersRow row = usersTable.FindByid(currentItem.id); 
row.BeginEdit(); 
row.last_name = "********"; 
row.EndEdit(); 

row.AcceptChanges(); 
usersTable.AcceptChanges(); 

int result = usersTA.Update(usersTable); 

SQL Server 2012.Datatable не будет обновлять мой DB

Я использовал генерироваться классы из VS 2013 в базу данных

Я пытаюсь обновить строку в моей БД, в 'usersRow строке' это меняет работает, но в БД нет никаких изменений. Что я делаю не так? result всегда 0.

+1

Удалить вызовы AcceptChanges. И – Steve

+1

Также проверьте строку подключения. Используете ли вы 'пользовательский экземпляр' и/или' AttachDbFileName'? –

+0

@Steve thx, это действительно работает! –

ответ

2

Это распространенное непонимание того, что делает метод AcceptChanges.
Я думаю, проблема возникает из исходного комментария в документации метода AcceptChanges.

Выполняет все изменения, внесенные в эту таблицу с момента последнего Вызывается AcceptChanges.

Многие люди думают, что это означает, что «фиксируется в таблице базы данных», вместо этого он означает «фиксируется в экземпляре in-memory объекта данных».

Затем, следующий комментарий к документам, намекает на то, что на самом деле происходит там.

Когда вызывается AcceptChanges, любой объект DataRow, все еще находящийся в режиме редактирования , успешно завершает свои изменения. DataRowState также изменяется: все добавлены , а измененные строки становятся неизменными, а удаленные строки удаляются.

Итак, есть этот DataRow.RowState свойство, которое выражает то, что текущее состояние строки в памяти, принадлежащей к экземпляру в памяти из DataTable. И именно это состояние помогает методу DataAdapter.Update в обнаружении того, что делать со строками.

Другими словами, метод Update решает обновить таблицу базы данных только для строк, которые не являются RowState==DataRowState.Unchanged. Но вызов AcceptChanges «фиксирует» эти строки, и их состояние становится неизменным. Тогда нет обновления.