2011-02-02 4 views
1

У меня есть SQL DB с различными таблицами, которые сохраняют информацию о продукте (это для интернет-магазина), и я кодирую на C#. Существуют варианты, связанные с данным продуктом, и, как упоминалось, информация, записанная об этих параметрах, распространяется по нескольким таблицам при сохранении.Проверка наличия элемента до сохранения

Теперь, когда я пришел для редактирования этого продукта в CMS, я вижу список существующих параметров продукта, и я могу добавить в этот список или удалить из него, как и следовало ожидать.

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

Описать снова, возможно, более четко: представьте, что у меня есть набор параметров при загрузке продукта, он загружается в память и добавляется в/удаляется в зависимости от того, что пользователь выбирает. Когда они нажимают «Сохранить», мне нужно проверить, какие параметры являются обновлениями, а какие - новыми в списке.

Любые предложения эффективного способа сделать это?

Спасибо.

ответ

1

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

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

Если эффективность с точки зрения элегантного или уменьшенного кода на стороне сервера, я бы посмотрел на использование какого-то ORM, например Entity Framework 4.0. С надлежащей архитектурой ORM вы можете почти перестать думать в терминах записей базы данных и INSERT/UPDATE и просто работать с коллекцией объектов в памяти.

+0

Спасибо за отзыв, Это всегда просто казалось мне утомительным, и когда что-то кажется утомительным, я склонен думать, что мне не хватает более эффективного способа сделать это. Приятно знать, что нет, несмотря на то, что это означает, что это займет некоторое время. – scaryjones

0

Запустите проверку запроса на идентификатор. Если он существует, вам необходимо обновить его. Если он не существует, вам нужно вставить его.

Без каких-либо подробностей я не совсем уверен, что еще вам рассказать. Это довольно стандартно.

+0

Спасибо за отзыв. Мне всегда было скучно, и когда что-то кажется утомительным, я склонен думать, что мне не хватает более эффективного способа сделать это.Приятно знать, что нет, несмотря на то, что это означает, что это займет некоторое время. – scaryjones

1

Я обычно делаю это, выполнив следующие действия:

  1. Для каждого элемента, выполнить запрос на обновление, который будет обновлять этот пункт, если он существует.
  2. После каждого обновления проверьте, сколько строк было обновлено (используя @@ ROWCOUNT в SQL Server). Если нулевые строки были обновлены, выполните вставку для создания строки.

В качестве альтернативы, вы можете сделать наоборот, если создать уникальное ограничение, которое предотвращает повторяющиеся строки:

  1. Для каждого пункта, попробуйте вставить его.
  2. Если вставка терпит неудачу из-за несогласия (проверьте код ошибки), вместо этого выполните обновление.
+0

Спасибо за отзыв. Мне всегда было скучно, и когда что-то кажется утомительным, я склонен думать, что мне не хватает более эффективного способа сделать это. Приятно знать, что нет, несмотря на то, что это означает, что это займет некоторое время. – scaryjones

+0

Если вы используете SQL Server, вы можете использовать команду MERGE. Вероятно, он делает то, что вы пытаетесь сделать. Однако отлаживать его непросто, поэтому я стараюсь избегать этого. –

Смежные вопросы