sqlbulkcopy usando sql CE

¿Es posible utilizar SqlBulkcopy con Sql Compact Edition, por ejemplo, archivos (* .sdf)?

Sé que funciona con SQL Server 200 Up, pero quería verificar la compatibilidad CE.

Si no lo hace, ¿alguien más conoce la forma más rápida de obtener un archivo de tipo CSV en SQL Server CE sin usar DataSets (vomitar aquí)?

BULKCOPY no es compatible con SQL CE. Esta es la forma más rápida si tiene una gran cantidad de filas en su tabla; ¡la inserción es demasiado lenta!

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); } } } } } 

Punto de referencia: tabla con 34370 filas

  • con inserciones: 38 filas escritas por segundo

  • de esta manera: 260 filas escritas por segundo

Tengo una biblioteca SqlCeBulkCopy aquí: http://sqlcebulkcopy.codeplex.com – incluso soporte IEnumerable.

Es posible boost mucho este tipo de operación. Para que esta operación sea útil (quiero decir, rápida y bastante segura), puede usar CE DataAdapter.

Por muestra, no se preocupan por las claves, los pasos enumerados a continuación pueden ayudarlo:

  1. Asegúrese de que las tablas de destino y objective tengan la misma estructura de campos;
  2. Clonar una tabla de datos virtual con una tabla de datos de la base de datos de origen (su selección);
  3. Cree un comando CE con el nombre de la tabla como texto de comando (TableDirect como commandtype);
  4. Cree un dataadapter CE desde el comando CE;
  5. Cree un CE commandbuilder desde CE dataatapter;
  6. Pase el comando Insert desde CE commandbuilder a CE dataadapter;
  7. Copie “n” filas de lotes desde su datatable de origen a la datatable de destino (el clon), haciendo algo como esto:

     '... 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 

De esta forma puedes actualizar varias filas sin mucho tiempo.

Tengo algunas aplicaciones que usan este método y la tasa promedio es de aproximadamente 1500 filas por segundo en una tabla con 5 campos NTEXT (lento) y 800000 filas.

Por supuesto, todo depende de la estructura de su mesa. IMAGE y NTEXT son ambos tipos de datos lentos.

PD: Como dije, a este método no le importan demasiado las teclas, así que ten cuidado.

No, no creo que SqlBulkCopy sea ​​compatible (vea MSDN ). ¿Quizás arrojar los datos como xml y desmantelarlos en el servidor? SQL / XML es bastante bueno en 2005/2008.

Es posible que también desee ver los parámetros de valores de tabla, pero dudo que CE los admita.