DataReader и SQLCommand - PullRequest
       43

DataReader и SQLCommand

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

Как говорят по радио - долгое время слушатель впервые звонил ....

Вот мой вопрос.VS 2005 База данных SQL Server 2005.Приложение Windows Forms.C #.Большой стол - 780К записей.Я назову это исходной таблицей.Необходимо перебрать исходную таблицу, и для каждой записи сделать что-то с другой таблицей, а затем записать обратно в исходную таблицу, что она была завершена.Я еще не успел обновить вторую таблицу ...

Я перебираю все записи исходной таблицы с помощью устройства чтения данных, используя объект подключения A. Для каждой записи я создаю оператор обновления для обновленияисходная таблица, чтобы указать, что эта запись была обработана - и использовать команду SQL против объекта соединения B, чтобы сделать это uodate.Так разные объекты подключения, потому что я знаю, что dataReader хочет эксклюзив.

Вот в чем проблема.После обработки X записей - где X, кажется, около 60 - время ожидания обновления.

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

Кто-нибудь видел это и знает, как его решить?

Приветствия

Пит

Ответы [ 3 ]

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

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

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

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

0 голосов
/ 15 декабря 2010

Есть ли какая-то причина, по которой вы не можете выбрать / обновить курсор и вернуть итоговый результат в приложение? Если процесс принадлежит БД, лучше всего сохранить его там.

Поочередно обновите тайм-аут команды, как упоминал Джон, - ваша единственная другая ставка.

0 голосов
/ 15 декабря 2010

Похоже, вам нужно правильно установить время ожидания команды для объекта команды. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout(v=vs.80).aspx

...