Вопрос о дизайне - обновите несколько строк с помощью c # - беспокойство по поводу производительности нескольких циклов - PullRequest
1 голос
/ 08 декабря 2010

У меня есть существующий веб-сайт (на основе .net 1.1), который вызывает веб-сервисы (на основе .net 1.1) для доступа к данным. Веб-сервисы вызывают хранимые процедуры для запуска SQL.

У меня есть родительский объект (буква) с несколькими дочерними объектами (комментариями) (5-25), и мне нужно обновить один столбец для каждого из дочерних объектов до нового значения - установить флажок для комментариев, чтобы например, установите статус утвержденного - это свойство находится в комментариях, а не в письме, так как дальнейшие неутвержденные комментарии могут быть добавлены позже.

Обычный подход, который мы выберем, заключается в создании нового веб-метода, например ApproveComments и передать в letterID, чтобы установить все комментарии в настоящее время на письмо для одобренного. Затем вызывается хранимая процедура ApproveCommentsOnLetter для ОБНОВЛЕНИЯ ApprovedFlag до True, где letterID = переданный параметр.

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

У меня была идея создать более общий веб-метод UpdateComments, который будет использоваться для всех обновлений комментариев. Я бы передал в него массив объектов Comments, которые бы имели свойства get / set. В этом случае я бы перебрал и обновил для каждого свойства свойство Status до True, прежде чем отправлять их в веб-метод, но в будущем другие столбцы можно будет установить аналогичным образом, избегая создания новых веб-методов.

Затем я немного спотыкаюсь с разделом базы данных. Такое ощущение, что следующим шагом будет наличие хранимой процедуры UpdateComment. Затем мне придется вызывать это несколько раз, по одному для каждого комментария, в свою очередь, для обновления. Я обеспокоен тем, что несколько повторных обращений к базе данных для этих вызовов (в настоящее время 5-25) не очень эффективны и просто обычно кажутся плохими . Хотя другой подход, который я вижу, заключается в том, чтобы эти «массовые» обновления вернулись к наличию определенного веб-метода и хранимой процедуры, предназначенной для одновременного обновления данного свойства, но затем я вернулся, где я начал с создания нового веб-методы и хранимые процедуры для каждой новой функциональности, которую мы добавляем в интерфейс.

Буду признателен за мысли о том, как к этому подойти - я не могу пойти и добавить ORM / новую версию .net / и т. Д., Поэтому нужно подумать о том, как лучше всего подойти к этому в рамках технологий Я уже использую.

Ответы [ 3 ]

1 голос
/ 08 декабря 2010

@ Durator

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

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

Реализация этого может быть осуществлена ​​несколькими способами. 1. Отправьте в ваш сохраненный процесс массив идентификаторов, разделенных запятыми и их в sp, разделите идентификаторы и выполните обновления.

Если вы используете MS SQL Server 2008, то существует новый тип переменной, который называется TableValueParameter или TVP. По сути, вы можете отправить свой storped процесс в .NET DataTable, который содержит записи, которые вы хотите отправить (столбцы и строки), а в SP вы рассматриваете параметр как «таблицу», так что вы можете делать соединения с ним, используя его ваши обновления.

1 голос
/ 08 декабря 2010

На первый взгляд кажется, что совершать по одному вызову в ряду - неправильный путь, но я советую попробовать и посмотреть. Это, безусловно, самое простое, и вы можете обнаружить, что у пользователя не возникает проблем с производительностью, когда вы приступаете к работе.

1 голос
/ 08 декабря 2010

следующим шагом будет наличие хранимой процедуры UpdateComment. Затем я должен был бы назвать это несколько раз

Вот и все - база данных не обрабатывает коллекции строк, в то время как веб-сервис в первую очередь заинтересован в коллекции строк.

Если вы можете перейти от хранимых процедур к модификации данных, управляемой приложением, нет ничего, что говорило бы о том, что вы не можете упаковать несколько операторов обновления в текст SqlCommand.

Или, если это не вариант, ничто не говорит о том, что вы не можете вызвать хранимый процесс много раз за один прием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...