sqlbulkcopy с использованием sql CE - PullRequest
14 голосов
/ 22 октября 2009

Можно ли использовать SqlBulkcopy с Sql Compact Edition, например, (* .sdf) файлы?

Я знаю, что он работает с SQL Server 200 Up, но хотел проверить совместимость с CE.

Если нет, знает ли кто-нибудь самый быстрый способ загрузки файла типа CSV в SQL Server CE без использования DataSets (см. Здесь)?

Ответы [ 4 ]

23 голосов
/ 23 октября 2009

BULKCOPY не поддерживается в SQL CE. Вот самый быстрый способ, если у вас в таблице огромное количество строк; вставка слишком медленная!

using (SqlCeConnection cn = new SqlCeConnection(yourConnectionString))
{
    if (cn.State == ConnectionState.Closed)
        cn.Open();

    using (SqlCeCommand cmd = new SqlCeCommand())
    {
        cmd.Connection = cn;
        cmd.CommandText = "YourTableName";
        cmd.CommandType = CommandType.TableDirect;

        using (SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Updatable | ResultSetOptions.Scrollable))
        {
            SqlCeUpdatableRecord record = rs.CreateRecord();

            using (var sr = new System.IO.StreamReader(yourTextFilePath))
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    int index = 0;
                    string[] values = line.Split('\t');

                    //write these lines as many times as the number of columns in the table...
                    record.SetValue(index, values[index++] == "NULL" ? null : values[index - 1]);
                    record.SetValue(index, values[index++] == "NULL" ? null : values[index - 1]);
                    record.SetValue(index, values[index++] == "NULL" ? null : values[index - 1]);

                    rs.Insert(record);
                }
            }
        }
    }
}

Тест: таблица с 34370 строками

  • со вставками: 38 строк, написанных в секунду

  • таким образом: 260 строк записывается в секунду

7 голосов
/ 20 апреля 2011

У меня есть библиотека SqlCeBulkCopy: http://sqlcebulkcopy.codeplex.com - даже поддержка IEnumerable.

1 голос
/ 05 сентября 2010

Возможно много увеличить этот вид операции. Чтобы сделать эту операцию полезной (я имею в виду быстрый и довольно безопасный), вы можете использовать CE DataAdapter.

По образцу, не заботясь о клавишах, перечисленные ниже шаги могут помочь вам:

  1. Убедитесь, что таблицы sorce и target имеют одинаковую структуру полей;
  2. Клонирование виртуального источника данных с источником данных из исходной базы данных (ваш выбор);
  3. Создать команду CE с именем таблицы в виде commandtext (TableDirect в качестве типа команды);
  4. Создание адаптера данных CE из команды CE;
  5. Создание компоновщика команд CE из CE dataatapter;
  6. Передать команду вставки из построителя команд CE в адаптер данных CE;
  7. Скопируйте "n" строк пакета из вашего источника данных в целевой объект данных (клон), сделав что-то вроде этого:

    '... previous codes
    For Each currentRow In sourceTable.Rows
       'u can do RaiseEvent Processing(currentRow, totalRows) here with DoEvents
       If targetTable.Rows.Count < 100 Then
          targetTable.InportRow(currentRow)
          targetTable.Rows(targetTable.Rows.Count - 1).SetAdded
       Else
          '...Here you wll call the CE DataAdapter's Update method (da.Update(targetTable))
          '...and then be sure you clone the targetTable again, erasing all previous  rows.
          '...Do a clone again, don't do just a "clear" in the Rows collection.  
          '...If u have an Autoincrement it will break all Foreign Keys.
       End If
       Next
       '... next codes
    

Таким образом, вы можете обновить несколько строк без особого времени.

У меня есть несколько приложений, использующих этот метод, и средняя скорость составляет около 1500 строк в секунду в таблице с 5 полями NTEXT (медленно) и 800000 строк.

Конечно, все зависит от структуры вашего стола. IMAGE и NTEXT оба являются медленными типами данных.

P.S .: Как я уже сказал, этот метод не имеет большого значения для ключей, поэтому будьте осторожны.

0 голосов
/ 22 октября 2009

Нет, я не думаю, что поддерживается SqlBulkCopy (см. MSDN ). Может быть, выбросить данные в виде XML и удалить их на сервере? SQL / XML довольно хорош в 2005/2008 годах.

Возможно, вы также захотите взглянуть на параметры таблицы-значения, но я сомневаюсь, что CE поддерживает их.

...