Сохранение отложенных изменений при многопользовательской работе

mix451
Дата: 14.03.2006 13:53:11
Добрый день!
Помогите разобраться со следующей проблемой: например, 2 пользователя работают с одной записью, 1ый вносит изменения, нажимает кнопку Сохранить, в БД происходят сохранения, все ок! 2ой пользователь пытается изменить ту же запись (дополнить своей информацией, а дополнить он должен - таково задание). При этом, когда он нажимает Сохранить вылетает exception с сообщением о том что запись уже изменена (версия записи dataSet не соответстует версии в БД). Я прочитал про различные стратегии обновления данных и понял, что мне подходит Оптимистическая стратегия, которая в принципе используется по-умолчанию.
Подскажите как правильно решить проблему конкуренционного обновления данных!
f45f
Дата: 14.03.2006 15:10:47
Оптимистическая стратегия проверят соответсвие полей в базе данных. Это понятно. Так вот - автоматом дизайнер подстваляет все поля для проверки. Нипиши сам адаптер в котором укажи только нужные поля для проверки.
private OleDbDataAdapter GetAdapter(OleDbConnection connection, OleDbTransaction MyTran)
{
	OleDbDataAdapter da = new OleDbDataAdapter();
	OleDbCommand cmd;
	s = "UPDATE Vtable SET v1 = ? where v2=? and v2=? ";
	cmd = new OleDbCommand(s, connection);
	cmd.Parameters.Add("v1",OleDbType.VarChar, 9, "v1");
	parm = cmd.Parameters.Add("@v2",OleDbType.VarChar, 5, "v2");
	parm.SourceVersion = DataRowVersion.Original;
	parm = cmd.Parameters.Add("@v3",OleDbType.VarChar, 2, "v3");
	parm.SourceVersion = DataRowVersion.Original;
	cmd.Transaction = MyTran;
	da.UpdateCommand = cmd;
	return da;
}
mix451
Дата: 14.03.2006 15:30:19
Спасибо за ответ, но как я понял это уже стратегия по принципу "последний победивший".. Т.е. запись, внесенная последним пользователем, будет отображена в БД, а предыдущее ее состояние будет перезаписано, кроме ключевый полей. Я правильно понял?
f45f
Дата: 14.03.2006 15:48:14
Точно, я на путал. Реализация оптимистической зависти от БД. Какая у Вас?
mix451
Дата: 14.03.2006 15:49:07
sql server 2000
f45f
Дата: 14.03.2006 15:56:13
http://www.zarech.ru/develop/Public/PessimisticLocking.asp
f45f
Дата: 14.03.2006 15:57:40
предудущий исходник - это оптимистеческая, в статье пессимистическая.
mix451
Дата: 14.03.2006 16:09:39
дело, как я понимаю, не в описании запроса Update. оптимистическая стратегия вылетает эксепшеном, мне нужно правильно отреагировать, т.е. не писать типа MessageBox.Show("Запись изменена др. польз-м") и заливать методом Fill все данные заного, а внести изменения в БД, но не затирая тех данных, что добавил др. юзер, чтоб юзер не почувствовал никаких проблем (для него это должно быть прозрачно).
f45f
Дата: 14.03.2006 16:31:13
пас, совсем не понятно что тебе нужно. ExecuteNonQuery - будет "последний победивший" (это так, к примеру). Если же ты хочешь обновить только те поля которые не изменены пользователем, то имхо нужно писать уже анализатор(тогда карты в руки и вперед - оригинальный значения у тебя есть, сравниваешь оригинальное значение со значениеми из базы, если равно апдейтишь, а нет - ну на нет и суда нет:) ). Вообщем не совсем понятно.
mix451
Дата: 14.03.2006 16:34:38
Вы сталкивались с проблемой многопользовательского доступа в бд, когда Вы хотите изменить запись, а она уже изменена другим пользователем?