Как вставить записи в базу данных SQL и показать количество введенных записей?

Используя VB .NET, я пытаюсь INSERT INTO записать SQL DataTable 27019 Records. Процесс INSERT INTO проходит успешно при нажатии кнопки «Вставить», но занимает много времени. Поэтому я хочу иметь возможность видеть, как и когда вводятся записи, показывая в Label/TextBox их прогресс. Например, при вставке первой записи текст должен быть "Введено 1/27019 записей", для следующих записей должно быть "Введено 2/27019 записей" и так далее.

Заранее спасибо.


person TheDProgrammer    schedule 08.04.2015    source источник
comment
Откуда берутся данные? Я бы предложил использовать класс SQLBulkCopy вместо INSERT INTO .., выполняемого в цикле.   -  person Maciej Los    schedule 08.04.2015
comment
@Maciej Лос, проблема не в функциональности команды «Вставить». Он работает нормально. Я хочу постепенно показывать в метке или текстовом поле, сколько записей было введено до сих пор... как введено 1/27019 записей... и так далее.   -  person TheDProgrammer    schedule 08.04.2015
comment
Когда такая часть данных вставляется в базу данных, это может привести к сбою базы данных. Так что мое предложение в силе ;)   -  person Maciej Los    schedule 08.04.2015
comment
Обновление графического интерфейса (метки или текстового поля) во время выполнения циклического процесса немного сложно, см. эту статью, чтобы узнать, как это сделать.   -  person ChicagoMike    schedule 08.04.2015
comment
Кстати, вы можете перехватывать строки, вставленные с помощью события SqlRowsCopied: msdn.microsoft.com/en-us/library/   -  person Maciej Los    schedule 08.04.2015
comment
Я считаю, что SqlRowsCopied запускается только при использовании SqlBulkcopy и только в том случае, если вы выбираете размер пакета меньше, чем количество вставленных строк.   -  person Alex    schedule 08.04.2015


Ответы (1)


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

person Alex    schedule 08.04.2015