Как обновить две разные таблицы с помощью команды обновления DetailsView
Я занимаюсь разработкой приложения ASP.NET на C#.
У меня есть две таблицы базы данных Food(Id, Name, Description) и FoodLog (Id, FoodId, FoodName, FoodDescription, ChangedFields, Date). Как видно из названия, FoodLog сохраняет историю изменений, внесенных пользователями, в записи Food и указывает в поле ChangedFields, какие поля были изменены по сравнению с предыдущей "версией" записи.
Для отображения пользователю определенной записи Food я использую элемент управления DetailsView. Когда пользователь нажимает кнопку " Обновить", выполняется команда UpdateCommand, связанная с источником SQLDataSource. Эта команда UpdateCommand просто изменяет соответствующую запись Food.
Чтобы добавить новую запись в таблицу FoodLog, мне нужно перехватить событие, запущенное DetailsView при обновлении. Когда я ловлю это событие, я вручную сравниваю запись, вставленную пользователем (еще не зафиксированную в БД), с записью в таблице Food, соответствующей его Id, чтобы отслеживать измененные поля и сохранять их в поле ChangeFields в Стол FoodLog. Теперь для выполнения этой задачи я могу использовать два события, запущенные DetailsView.
ItemUpdated: запускается после выполнения команды UpdateCommand. Таким образом, я теряю отслеживание измененных полей, потому что предыдущая "версия" записи уже была перезаписана.
ItemUpdating: запускается до выполнения команды UpdateCommand. Таким образом, у меня все еще есть старая "версия" записи в БД, и я могу сделать сравнение и затем выполнить dtore в таблице FoodLog. Однако, если тогда по какой-либо причине происходит сбой UpdateCommand, у меня есть запись в журнале, которая не соответствует изменению в таблице Food.
Кто-нибудь может помочь с этой проблемой? Можно ли написать два разных выражения SQL в UpdateCommand?
Спасибо
2 ответа
Вы можете использовать хранимую процедуру для ваших обновлений.
Сначала вызовите хранимую процедуру, когда сохраните старые значения в таблице журнала, а затем обновите основную таблицу. Используйте транзакцию, чтобы избежать частичного обновления в случае ошибки.
Если бы вы могли только сильный текст, используйте sp для генерации обновления и слияния и используйте только событие.NET. Если бы вы могли просто использовать sp для генерации обновления и слияния и использовать только событие.NET, вызывающее sp