У меня есть хранимая процедура, которая выполняет массовую вставку в базу данных SQL Server 2005. Когда я вызываю эту хранимую процедуру из некоторого SQL (передавая имя файла локального формата и файла данных), она работает нормально. Каждый раз.
Однако, когда эта же хранимая процедура вызывается из кода C# .NET 3.5 с использованием SqlCommand.ExecuteNonQuery, она работает с перебоями.
В случае сбоя генерируется SqlException, в котором говорится:
Cannot bulk load. Invalid column number in the format file "c:\bulkinsert\MyFile.fmt"
Я не думаю, что это сообщение об ошибке правильное.
Кто-нибудь испытывал подобные проблемы с вызовом массовой вставки из кода?
Спасибо.





Как вы делаете объемную вставку? Обычно проблема (в этом сценарии) заключается в том, является ли «c: \» серверным «c: \» или клиентским «c: \».
Тем не мение. из кода C# самый простой подход - использовать SqlBulkCopy. Этот класс обеспечивает прямой доступ к функциям массовой вставки из управляемого кода, включая сопоставления (хотя я никогда не беспокоился о них).
Если файл похож на csv / tsv / similar, настоятельно рекомендуется использовать CsvReader. Это обеспечивает интерфейс IDataReader, который WriteToServer использует наиболее эффективно.
Я думаю, проблема была в том, что нужно сделать с файлом форматирования. Я больше не использую файл формата, и, похоже, он работает в 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;
использовать
Exec sp_ExecuteSql @Sql; (100% рабочий)
exec(@sql) не очень мощный, так как имеет некоторые ограничения
Пожалуйста, не добавляйте подписи к своему сообщению. Они считаются шумом и обычно удаляются.