¿Es SqlBulkCopy el enfoque para inserciones masivas regulares?

.net security sqlbulkcopy

Pregunta

Estoy desarrollando una herramienta en línea en .NET 4 para leer páginas de Excel potencialmente grandes (miles de filas) en un DataTable y luego usar SqlBulkCopy.WriteToServer () para cargarla en una tabla Sql Server 2000 (que pronto será 2008). Es solo para uso dentro de mi empresa, por lo que no tengo que preocuparme demasiado por protegerlo para uso externo.

Lo tengo funcionando como un sueño y, naturalmente, es mucho más rápido que las inserciones fila por fila que estaba realizando antes. Pero ahora me pregunto si es el enfoque correcto.

En primer lugar, desde un punto de vista empresarial, todos los demás accesos a datos se realizan a través de procedimientos almacenados con permisos de ejecución otorgados al usuario, mientras que esto requiere seguridad a nivel de tabla.

En segundo lugar, la mayoría de la documentación en línea menciona que esto es más una herramienta para operaciones aisladas en lugar de la que tendría el uso diario.

No puedo encontrar muchas referencias a los aspectos negativos del uso de SqlBulkCopy. ¿Hay algún problema de seguridad u otros problemas que me deban preocupar? ¿Hay algún enfoque alternativo que pueda considerar? Al igual que con todo, mi principal objetivo es hacer que funcione lo más rápido posible, a la vez que sea seguro y el enfoque "correcto".

Muchas gracias.

Respuesta aceptada

Yo diría que estás bien con esta elección. Se está utilizando para obtener un beneficio de rendimiento sobre las instrucciones de inserción estándar con un comando regular, llamadas no agrupadas. Es por esto que puede diferir del enfoque "estándar" con los procedimientos almacenados.

Yo diría que la seguridad no es una gran preocupación simplemente validando la entrada. Todo lo que parece que está haciendo con él es transferir datos directamente a una tabla, sin ejecutar ningún SQL personalizado.

En cuanto a ejecutarlo más de una vez, lo usamos en código de producción para acciones de datos grandes en múltiples lugares, varias veces: el beneficio de rendimiento es mayor que el código DAL ligeramente diferente que debe usar para obtenerlo.

El único problema potencial es la presión de memoria. Si crea una DataTable partir de un gráfico de objetos (algo que hacemos), obtiene una segunda copia de los datos en la memoria (albiet, de corta duración). En algunos lugares, hemos cambiado el código de usar un DataTable para usar una clase personalizada que implementa IDataReader sobre el gráfico del objeto (digo gráfico, generalmente un par de listas planas). Esto evita la presión de memoria.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué