[ASP.NET] Аналог курсора?

Realist

Пусть у меня есть селект, который возвращает набор новых событий. Скажем: дата, тип события. Есть таблица "зарегестрированные события": дата, тип, число раз. Так вот, для каждого нового события я хочу следующее: если оно уже есть (то есть в таблице "зарегестрированные события" есть запись с такой же датой и таким же типом увеличить на единичку счетчик (поле "число раз"). Если его нет, то зарегестрировать это событие (создать новую запись в "зарегестрированные события").
Я расчитывал сделать так: по селекту создать DataReader. В цикле чтения из этого DataReader производить insert или update. Беда в том, что я не могу использовать соединение к БД (и как следствие, транзакцию пока у меня не закрыт DataReader. Неужели я должен все данные, которые мне возвращает Select, откопировать в массив какой-нить, а потом работать уже с массивом.
Что делать? Я понятно написал?
Спасибо.

Helga87

Можно открыть второе соединение. Или я туплю?

Realist

Оно будет в другой транзакции, что не есть ГУД

Helga87

ну, вообще, если ты используешь TransactionScope, то вполне себе они в одной транзакции будут жить.
правда, это требует установленного и запущенного DTS на сервере. DTS — Distributed Transaction Service или как-то так.

Dasar

правильное поведение:
выдернуть dataTable из базы
обновить datatable или создать новый datatable
залить обновленный datatable в базу
работать это будет на порядок быстрее, чем весь геморой с одиночными insert/update-ами

bastii

а зачем данные вообще забирать через датаридер, разве нельзя на сервере две команды выполнить: INSERT SELECT и UPDATE?
если очень надо что-то делать на веб сервере и БД sql сервер, то можно сделать как сказал, только средствами sql сервера подключить вторую сессию к транзакции первой сессии — в принципе могу в BOL найти как такое делается, не помню уже

bastii

правильное поведение:выдернуть dataTable из базыобновить datatable или создать новый datatableзалить обновленный datatable в базуработать это будет на порядок быстрее, чем весь геморой с одиночными insert/update-ами
+1, меньше юлокировок, маштабируемость будет лучше
только не совсем понятно, как формируется таблица с новыми событиями

Realist

а зачем данные вообще забирать через датаридер, разве нельзя на сервере две команды выполнить: INSERT SELECT и UPDATE?

Я слишком упростил, чего я делаю. Поскольку вопрос вылез за наивное "как тут называется курсив", сформулирую, что мне на самом деле нужно (тоже упрощенно, но постараюсь ничего не упустить . У меня есть таблица "Клиенты" (идентификатор, имя, телефон, что любит: мороженое, пироженое или рыбий жыр есть таблица "Продукция" (наименование, цена, тип: мороженое, пироженое, рыбий жир). Я хочу формировать список адресной рекламы, каких клиентов мне надо оповестить о каких товарах. Любители мороженого должны узнать обо всех имеющихся сортах мороженого, любители пироженых — обо всех пироженых. Этот список рассылки я хочу хранить (чтоб отслеживать выполнение ну и пополнять (по мере прихода нового товара). Сейчас меня интересует как из данного набора клиентов и набора товаров соорудить список рассылки.
Я бы сделал "SELECT * FROM Клиенты, Товары WHERE Клиент.любит=Товар.имеет_тип". Но тогда получается, что одному иванову я должен позвонить 30 раз (по числу сортов мороженого а всего записей нагенирируется порядка 12 тысяч. Это не дело.
То, что об одной и той же лакомке я должен сообщить 30 раз: по разу Иванову, Петрову и прочим, это факт объективной реальности.
Поэтому я считаю, что есть сущность "Телефонные звонки", которая относится к "Товары" как много ко многим. Есть таблица, реализующая эту связь. Скажем "ТоварыЗвонки".
Теперь вопрос. Как мне так исхитрится, чтобы заполнить таблицы "телефонные звонки" "товарыЗвонки"?

Realist

Выдернуть могу. Обновить или создать могу. Про залить, не понял. Беда в том, что изначально я упростил, что мне надо. Тут более подроюное описание
Если у меня в базе есть две таблицы, связанные ключом, а еще есть аналогичные по структуре два datatable. Эти тейблы содержат то, что я хотел бы добавть в базу. Только с первичными ключами накладочка — они ж автоинкрементом генерятся. Так вот, как мне эти тейблы в базу залить?
Или я идеологию не секу?
Спасибо

Dasar

Только с первичными ключами накладочка — они ж автоинкрементом генерятся.
именно поэтому, плохим тоном считается - создание автоинкрементных ключей.

Dasar

Теперь вопрос. Как мне так исхитрится, чтобы заполнить таблицы "телефонные звонки" "товарыЗвонки"?
какое кол-во записей в таблицах?

Dasar

> Теперь вопрос. Как мне так исхитрится, чтобы заполнить таблицы "телефонные звонки" "товарыЗвонки"?
объясни, плиз, следующие непонятные мне моменты:
1) как на это накладывается ось время (где и как записано, что о таких-то новинках мы уже сообщили данному клиенту)?
2) и как накладывается адресность - т.е. понимание того, о каких товарах мы должны сообщить в данный конкретный звонок?

Realist

Если честно, то я сам не знаю
Есть таблица "Тел. звонки". У каждой записи есть статус: к испонению либо выполнено (ну либо еще что). К каждой записи привязано (таблицей ЗвонкиТовары а каких товарах мы сообщали (собираемся сообщить). Дальше, девочка-оператор садится и пишет запрос на все звонки, у которых статус "к исполнению". И для каждого такого звонка она может получить список товаров, о которых она должна сообщить.
Это все относится к логике пользования тех данных, которые я сейчас хочу научится генерировать.
Если вопрос в том, какие привязки клиентов к товарам следует сгенерировать в данный момент, то я мыслю так: садится босс этой девушки-оператора и генерирует привязки для всех клиентов ко всем товарам, пришедшим за последнюю неделю, например.
Товаров порядка 150, клиентов порядка 1000, правило определения подходящести товара клиенту на самом деле довольно извращнное.
Оставить комментарий
Имя или ник:
Комментарий: