Sqlbulkcopy с использованием sql CE
Можно ли использовать SqlBulkcopy с Sql Compact Edition, например. (*.sdf)?
Я знаю, что он работает с SQL Server 200 Up, но хотел проверить совместимость с CE.
Если кто-то еще не знает самый быстрый способ получить файл типа CSV в SQL Server CE без использования DataSets (puke here)?
Ответы
Ответ 1
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 строками
Ответ 2
У меня есть библиотека SqlCeBulkCopy здесь: http://sqlcebulkcopy.codeplex.com - даже поддержка IEnumerable.
Ответ 3
Можно увеличить этот вид операции.
Чтобы сделать эту операцию полезной (я имею в виду быстрый и довольно безопасный), вы можете использовать CE DataAdapter.
По образцу, не заботясь о клавишах, приведенные ниже шаги помогут вам:
- Убедитесь, что таблицы sorce и target имеют одинаковую структуру полей;
- Клонирование виртуального datatable с datatable из исходной базы данных (ваш выбор);
- Создайте команду CE с именем таблицы в качестве командного текста (TableDirect как commandtype);
- Создайте адаптер данных CE из команды CE;
- Создайте командный сервер CE из файла данных CE;
- Передайте команду Insert из CE commandbuilder в CE dataadapter;
-
Скопируйте ряды строк "n" из исходного источника данных в целевой объект datatable (клон), сделав что-то вроде этого:
'... 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 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.: Как я уже сказал, этот метод не заботится о ключах, поэтому будьте осторожны.
Ответ 4
Нет, я не думаю, что поддерживается SqlBulkCopy
(см. MSDN). Возможно, забросите данные в xml и разделите их на сервере? SQL/XML довольно хорош в 2005/2008 году.
Вы также можете посмотреть параметры таблицы-значения, но я сомневаюсь, что CE поддерживает их.