Многострочный INSERT INTO в .NET на SQL2008 .NET 3.5 - PullRequest
1 голос
/ 01 августа 2011

У меня есть CSV-файл с разделителями-запятыми, загружаемый в значение String, сгенерированное как часть преобразования XSLT в C # - (сборка CLR, консольное приложение).

Мне нужно, чтобы это приложение на C # выводило этот CSV-файл в таблицу базы данных, по одной строке за раз.и так как я довольно неопытен в C #, я понятия не имею, как лучше всего этого достичь!

В SQL я справился с этим с помощью следующего оператора SQL:

INSERT INTO CsvData 
    (ID, sFilename, iLineCount, sData, dDate)
SELECT @ID, @Filename, id, val, CAST(getdate() as smalldatetime) 
  FROM dbo.split(@CSVFile,char(13))

Функция dbo.splitберет @CSVFile и его Delimeter (в данном случае char (13)) и возвращает таблицу с 1 строкой на строку в CSVFile (id = identity, val = Linedata), которая затем используется для заполнения таблицы CsvData.

Я не могу передать @CSVfile в качестве параметра в SQL StroedProc, поскольку он может стать ОЧЕНЬ большим, поэтому я хочу, чтобы все это было заключено в код C #.

Как мне лучше всего добиться этого.NET

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Вы можете использовать класс SqlBulkCopy от поставщика .NET SqlClient. Проверьте эту статью MSDN на ее использование. Это обеспечивает хорошую производительность в отношении массовых вставок. Однако сначала вы должны прочитать данные из CSV в структурированном формате, поскольку для работы SqlBulkCopy требуется DataTable или IDataReader. У вас есть 2 варианта:

  1. Загрузка всего вашего CSV-файла в объект DataTable, который может быть не лучшим решением, если ваш CSV-файл очень большой
  2. Создайте CsvDataReader в качестве курсора только для чтения и только для пересылки для ваших файлов CSV. Вы можете найти некоторые реализации в Интернете.

Поскольку вы говорите, что ваш CSV загружается в строковое значение, то заполнение DataTable данными не составит труда. Используйте этот DataTable в качестве аргумента для метода SqlBulkCopy.WriteToServer.

0 голосов
/ 01 августа 2011

Попробуйте LINQ to CSV.

http://blogs.msdn.com/b/ericwhite/archive/2008/09/30/linq-to-text-and-linq-to-csv.aspx

Эта реализация подразумевает итерацию, а не массовую вставку, хотя

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