лучший способ для генерации массового оператора вставки в C #? - PullRequest
2 голосов
/ 14 февраля 2009

Мне нужно вставить кучу похожих записей в таблицу, и мне было интересно, есть ли хороший / простой способ сделать это.

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

Ответы [ 4 ]

5 голосов
/ 14 февраля 2009

Класс SqlBulkCopy имеет WriteToServer методы, которые пишут несколько записей.

Я создал класс, который реализовал интерфейс IDataReader, который я могу передать в качестве параметра методу SqlBulkCopy.WriteToServer (см. ADO.NET: Создание пользовательского поставщика данных для использования с .NET Data Access Framework для примера реализации интерфейса IDataReader.

Возможно, существует более простой способ, чем реализация IDataReader (т. Е. С помощью одного из других SqlBulkCopy.WriteToServer методов).

3 голосов
/ 14 февраля 2009

Я думаю, что общее практическое правило заключается в том, что вы не хотите открывать / закрывать соединение для каждой вставки. Как бы это ни звучало, стоит упомянуть, что я был свидетелем этой проблемы дважды, оба с SQL-сервером. Внутри цикла код, который я исправил, называется внешней библиотекой классов, которая открывает / закрывает соединение с каждой вставкой. В напряженный день пул подключений заполнился, а исключения вышли из строя. Это также приводило к ошибкам в других приложениях, поскольку не удалось установить соединение. Исправление, конечно, заключалось в том, чтобы открыть соединение перед циклом, вызвать функцию ExecuteNonQuery () внутри цикла (снова и снова) и закрыть соединение после цикла. Кажется тривиальным, но это действительно распространенная ошибка.

С наилучшими пожеланиями ...

0 голосов
/ 14 февраля 2009

Если исходные данные находятся в текстовом файле (CSV или какой-либо стандарт, который вы можете прочитать), используйте StreamReader для чтения каждой строки и функцию, которая берет эту строку и преобразует ее в один оператор вставки. Тогда просто дай летать

Например, скажем, у вас есть такой файл:

foo 1
bar 2
baz 3
...


using(StreamReader sr = new StreamReader(File.Open("sourcefile.txt", FileMode.Open)))
{
  using(SqlConnection conn = new SqlConnection(connectionString))
  {
   conn.Open();
  string line ="";
  while((line = sr.ReadLine()) != "")
  {
     string[] parts = line.split(new string[]{" "}, StringSplitOptions.None);
     string cmdTxt = String.Format("INSERT INTO MyTable(name, value) VALUES('{0}','{1}')", parts[0], parts[1]);

      using(SqlCommand cmd = new SqlCommand(cmdTxt, conn))
      {
         cmd.ExecuteNonQuery();
      }
   }
}

}

0 голосов
/ 14 февраля 2009

Если ваши данные хранятся в Csv или XML, вы можете импортировать записи с SQL-сервера (при условии, что вы используете SQL-сервер)

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