SPROC для обновления записи: как обрабатывать неизмененные значения - PullRequest
0 голосов
/ 21 сентября 2009

Я вызываю обновление SPROC из моего DAL, передавая все (!) Поля таблицы в качестве параметров. Для самой большой таблицы это всего 78. Я передаю все эти параметры, даже если возможно только одно значение изменилось.

Мне это кажется неэффективным, и я удивлялся, как это сделать лучше.

Я мог бы определить все параметры как необязательные и передать только те, которые были изменены, но мой DAL не знает, какие значения изменились, потому что я просто передаю ему модель - объект.

Я мог бы сделать выбор в таблице перед обновлением и сравнить значения, чтобы выяснить, какие из них изменились, но это, вероятно, также приводит к большим накладным расходам, также (?)

Я как бы застрял здесь ... Мне очень интересно, что вы об этом думаете.

edit: забыл упомянуть: я использую C # (Express Edition) с SQL 2008 (также Express). DAL, который я написал «сам» (используя эту статью). Возможно, это не самый современный способ (начиная с 2006 года, так сказать, «pre-Linq», но Linq работает только для локальных экземпляров SQL в Express), но моей главной целью было изучение C #, поэтому я думаю, это не так уж плохо.

Ответы [ 3 ]

0 голосов
/ 21 сентября 2009

Вы можете внедрить отслеживаемое отслеживание изменений в объектах вашей модели. Таким образом, вы можете отслеживать любые изменения в ваших объектах, сохраняя предыдущее значение свойства каждый раз, когда задается новое значение.
Эта информация может храниться одним из двух способов:

  1. как часть частного состояния каждого объекта
  2. Централизованно в классе " manager ".

В первом решении вы могли легко реализовать эту функцию в базовом классе и запустить ее во всех объектах модели посредством наследования.

Во втором решении вам необходимо создать некоторый класс контейнера, который будет хранить ссылку и уникальный идентификатор для любого создаваемого объекта модели и записывать все изменения его состояния в центральном хранилище.
Это аналогично тому, как во многих средах ORM (объектно-реляционное отображение) достигается такая функциональность.

0 голосов
/ 22 сентября 2009

Существуют готовые ORM, которые относительно хорошо поддерживают подобные сценарии. Написание собственного ORM оставит вас без таких функций.

Я считаю, что шаблон "object.Save ()" ведет к такому поведению, но нет никаких причин, по которым вам нужно следовать этому шаблону (хотя я лично не являюсь поклонником object.Save (), я чувствую, как будто я в меньшинстве).

Существует несколько способов узнать, что изменилось на уровне данных, и большинство из них поддерживается стандартными ORM. Вы также можете сделать интерфейс и бизнес-уровень достаточно умным, чтобы передать эти знания на уровень данных.

Два варианта, которые я предпочитаю:

  1. Генерация / обновление ручного кодирования методы, которые принимают только набор параметры, которые имеют тенденцию изменяться.
  2. Генерация операторов обновления полностью на лету.
0 голосов
/ 21 сентября 2009

Если вы можете изменить DAL (без изменений, отменяемых после того, как слой «регенерируется» из новой схемы при внесении изменений), я бы рекомендовал передать структуру, содержащую столбец, изменяемый со значениями, и ключ структуры kontaing столбцы и значения для обновления.

Это можно сделать с помощью хеш-таблиц, и, если схема известна, с ней довольно легко будет манипулировать этой функцией в «новой» функции обновления.

Если это автоматический DAL, это некоторые недостатки использования DAL

...