Сбой массовой вставки SQL Server при вызове из .NET SqlCommand - PullRequest
3 голосов
/ 16 января 2009

У меня есть хранимая процедура, которая выполняет массовую вставку в базу данных SQL Server 2005. Когда я вызываю эту хранимую процедуру из некоторого SQL (передавая имя локального файла формата и файла данных), она работает нормально. Каждый раз.

Однако, когда эта же хранимая процедура вызывается из кода C # .NET 3.5 с использованием SqlCommand.ExecuteNonQuery, она работает с перебоями.

При сбое генерируется SqlException с указанием:

Невозможно выполнить массовую загрузку. Неверный номер столбца в файле формата "c: \ bulkinsert \ MyFile.fmt"

Я не думаю, что это сообщение об ошибке является правильным.

Кто-нибудь сталкивался с подобными проблемами при вызове массовой вставки из кода?

Спасибо.

Ответы [ 3 ]

1 голос
/ 16 января 2009

Как дела с массовой вставкой? Обычно проблема (в этом сценарии) заключается в том, является ли «c: \» серверной «c: \» или клиентской «c: \».

Тем не менее. из кода C # самый простой подход - использовать SqlBulkCopy. Этот класс обеспечивает прямой доступ к функциональности массовой вставки из управляемого кода, включая сопоставления (хотя я никогда не беспокоился о них).

Если файл похож на csv / tsv / Similar, то настоятельно рекомендуется CsvReader . Это обеспечивает интерфейс IDataReader, который наиболее эффективно использует WriteToServer.

0 голосов
/ 18 ноября 2011

использование

Exec sp_ExecuteSql @Sql; (100% работает)

exec(@sql) не очень мощный, поскольку имеет некоторые ограничения

0 голосов
/ 19 января 2009

Я думаю, что проблема была в todo с форматом файла. Я больше не использую форматный файл, и теперь он работает 100% времени. Вместо этого я указываю терминаторы полей и строк в SQL.

Declare @Sql Nvarchar(2000); 

SET @Sql = 
'Bulk Insert TestOutputPretest
From  ''c:\rawdata\bulkinsert\Segment1839204.dat''
 WITH 
      (
         FIELDTERMINATOR ='','',
         ROWTERMINATOR = ''\n''
      )'

Exec sp_ExecuteSql @Sql;
...