Ограничение количества строк, вставляемых в базу данных SQL Server - PullRequest
2 голосов
/ 29 июня 2010

У меня есть программа на C # в VS, которая запускает mainform.

Эта основная форма экспортирует данные в базу данных SQL с хранимыми процедурами в таблицы.Экспортированные данные - это много данных (более 600 000 строк).

У меня проблема, хотя.На моей основной форме мне нужно иметь «интервал записи базы данных».Это количество количества «строк», которые будут импортированы в базу данных.

Моя проблема, однако, состоит в том, как выполнить этот интервал.Mainform запускается, и когда основная программа завершена, sql по-прежнему принимает данные IN в течение еще 5-10 минут.

Поэтому, если я закрою основную форму, остальные данные не будут импортированы мной.

Вы, профессиональные программисты, знаете, как я могу каким-то образом общаться с SQL, чтобы экспортировать данные только для указанного пользователем интервала.T

Это должно быть сделано с моим классом c #.

Я не знаю, с чего начать.

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

Ответы [ 3 ]

2 голосов
/ 29 июня 2010

Если данные имеют фиксированный формат (т. Е. Для каждой строки будут одинаковые столбцы, и они не будут сильно изменяться), вам следует обратить внимание на Bulk Insert. Он невероятно быстр при вставке большого количества строк.

Основой является то, что вы записываете свои данные в текстовый файл (например, csv, но вы можете указать любой разделитель, какой захотите), а затем выполняете команду BULK INSERT на сервере. Одним из аргументов является путь к файлу, который вы записали. Это немного неудобно, потому что вы должны записать файл в папку на сервере (или путь UNC, к которому сервер имеет доступ), что приводит к настройке общих папок Windows или настройке FTP на сервере. Это похоже на то, что вы хотите использовать.

Вот документация MSDN по BULK INSERT:
http://msdn.microsoft.com/en-us/library/ms188365.aspx

0 голосов
/ 06 июля 2010

Как и все другие комментарии ранее, я предлагаю вам использовать BulkInsert.Вы будете удивлены тем, насколько высока производительность, когда речь идет о большом наборе данных, и, возможно, ваше представление об интервале больше не требуется.Вставка 100 КБ записей может занять всего несколько секунд.

Зависит от того, как написан ваш код, ADO.NET имеет встроенную поддержку BulkInsert через SqlBulkCopy, см. Код ниже http://www.knowdotnet.com/articles/bulkcopy_intro1.html

Если вы использовали Linq для db для своего кода,уже есть какой-то умный код, написанный как метод расширения для текста данных, который преобразует набор изменений linq в набор данных и внутренне использует ADO.NET для выполнения массовой вставки

http://blogs.microsoft.co.il/blogs/aviwortzel/archive/2008/05/06/implementing-sqlbulkcopy-in-linq-to-sql.aspx

0 голосов
/ 29 июня 2010

Вместо экспорта всех ваших данных в SQL и , затем попытка прервать или управлять нагрузкой. Лучшим процессом может быть разделение вашей нагрузки на более мелкие куски (10 000 записей или около того) и проверка, является ли пользователь хочет продолжать после каждой загрузки. Это дает вам гораздо больше гибкости и контроля над нагрузкой, чем выгрузка всех 600 000 записей в SQL и попытка управления процессом.

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

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