Правильный способ экспорта нескольких записей в Access с использованием OLEDB - PullRequest
0 голосов
/ 09 декабря 2010

Я не знаю много об экспорте данных с использованием OLEDB, я понял следующее:

using (OleDbConnection conn = new OleDbConnection(connString))
{
   try
   {
      conn.Open();
      foreach (T t in rows)
      {
         using( OleDbCommand oleDbCommand = new OleDbCommand(insertString, conn))
         {
               OleDbParameter param = new OleDbParameter(.., ..);
               oleDbCommand.Parameters.Add(param);
               //add more parameters
               oleDbCommand.ExecuteNonQuery();
         }
      }
   }
   catch (Exception e)
   {
      //handle
   }
}

Сначала я не использовал оператор using для OleDbCommand (то естьраспоряжаться OleDbCommand).Но в этом случае файл блокировки записи остался в базе данных, даже если я закончил экспорт.Вместе с оператором (внутренним) Using экспорт выглядит медленнее.Зачем?И как добиться как быстрого экспорта, так и снятия блокировки записи в конце экспорта?

1 Ответ

0 голосов
/ 09 декабря 2010

Поскольку вы не закрываете соединение, файл ldb остается в наличии, поскольку вы все еще подключены к БД.

Итак, вы должны поместить оператор using вокруг объявления соединения (или закрыть соединениев блоке finally вашего оператора try [это именно то, что делает оператор using nb).

using( var conn = new OleDbConnection (connectionstring) )
{
    conn.Open();

    using( cmd = conn.CreateCommand() )
    {
         cmd.Parameters.Add (..);
         ...

         for( ... )
         {
            cmd.Parameters.Clear();
            cmd.CommandText = "";
            cmd.Parameters["@p_param"].Value = ...

            cmd.ExecuteNonQuery();
         }
    }
}

С помощью предложения using в цикле for вы удаляете OleDbCommand для каждой записи, которую вы используете.собираюсь вставить.Однако вы можете повторно использовать экземпляр OleDbCommand для каждой вставки.(См. Код выше).

Рядом с этим вы должны явно начать транзакцию.Поскольку, если вы этого не сделаете, для каждого оператора вставки будет создана неявная транзакция.Кроме того, выполнив все вставки внутри одной транзакции, вы сможете откатить все изменения (вставки), которые вы сделали при возникновении ошибки.
(Например, если вставка строки № 159 завершится неудачно, выможет откатить все 158 вставок, которые вы сделали ранее).

...