Tienes que realizar una migración de una base de datos?
Tienes que copiar una Excel a una base de datos?
Tienes que copiar toda la información de una griv a una base de datos?
Pues la solución para el caso de .Net es una clase llamada SqlBulkCopy esta clase nos permite copiar un dataset o un datatable a una base de datos siempre y cuando tengan la misma estructura.
Les advierto a todos el hecho de no usar el SqlBulkCopy rutinariamente no es conveniente ya que esto da pie a errores de inserción y no permite controlar exactamente donde se da el error.
Ejemplo si queremos copiar 5 registros a una base de datos y controlar el hecho de un posible error lo mejor es usar un RollBack si ocurre un error no se guardan los insert de los registros antes de que se desatara la excepción, de este tema hablare en otra ocasión.
Bien ahora entonces, ¿cuándo usar SqlBulkCopy?
– Migración de base de datos
– Copiado de datos desde una estructura Excel
– Inserción masiva de datos
Bueno ahora veremos un ejemplo de cómo se usa esta clase útil para muchos casos
‘ se usaran los siguientes namespace
Imports System.Data.SqlClient
Imports System.Data.Sql
‘Necesitamos lo usual una conexión, un objeto command y una datatable
Dim cmd As New SqlCommand()
Dim conn As SqlConnection
Dim tabla As New DataTable
‘aca los string de conexion uno para capturar los datos
‘ y el otro para copiar los datos a la otra base de datos
Public cadenaconexionorigen As String = String.Empty
Public cadenaconexiondestino As String = String.Empty
cadenaconexionorigen = "Persist Security Info=False;User ;Password=sa;Initial Catalog=BDOrigen;Data Source=Servidor1\”
cadenaconexiondestino = "Persist Security Info=False;User ;Password=sa;Initial Catalog=BDDetino;Data Source=Servidor2\”
Bueno ahora para realizar un procedimiento sencillo
‘ despues de asignar el conection string abrimos la conexión
connOrigen.Open()
‘ asigno la conexion
cmd.Connection = connOrigen
‘le digo que va hacer de tipo texto
cmd.CommandType = CommandType.Text
‘ seleciono todo de la tabla ya se que se va migrar toda
cmd.CommandText = "SELECT * FROM tCliente"
‘ ejecuto la sentencia, cierro la coenxion y lleno el datatable
cmd.ExecuteReader()
connOrigen.Close()
adaptador.Fill(tabla)
Ahora si a lo que vinimos bueno ya tenemos nuestros datos y vamos a migrarlos a una nueva base de datos usando BulkCopy hacemos esto:
‘abro la conexión de destino
connDestino.Open()
‘ creo el objeto BulkCopy
Dim copia As New SqlBulkCopy(connDestino)
‘le digo la tabla que va migrar
copia.DestinationTableName = “tCliente”
‘copio los datos
copia.WriteToServer(tabla)
‘cierro la conexión
connDestino.Close()
ok como ven que fácil es copiar datos desde un servidor a otro con pocas líneas de código,
ahora bien tuve otro problema al usar esta clase generalmente en las tablas hay un ID que se coloca autoincrementado al momento en que se copia los datos con esta clase él les asigna un nuevo valor a esta columna comenzando desde el valor inicial que tenga en la nueva tabla, así que OJO al realizar la una migración.
Como se soluciona esto? De esta manera:
connDestino.Open()
cmd.Connection = connDestino
cmd.CommandType = CommandType.Text
‘ con este codigo apagamos el campo identidad de toda la tabla antes ‘de insertar
cmd.CommandText = "SET IDENTITY_INSERT t_Cliente ON"
adaptador.SelectCommand = cmd
cmd.ExecuteNonQuery()
‘escribimos sobre la tabla
Dim copia As New SqlBulkCopy(cadenaconexiondestino, SqlBulkCopyOptions.KeepIdentity)
copia.DestinationTableName = "tCliente"
copia.WriteToServer(tabla)
copia.Close()
‘quitamos el comando anterior
cmd.CommandText = "SET IDENTITY_INSERT t_Cliente OFF"
adaptador.SelectCommand = cmd
‘confirmamos y cerramos la conexion
cmd.ExecuteNonQuery()
connDestino.Close()
Espero que les sirva por favor cualquier duda o inquietud me escriben un comentario o me contactan mis datos están en el perfil.
Disculpa estaba probando tu codigo y no se si puse la atencion requerida, pero me sale un error en adaptador y no supe donde lo declaraste, ademas en esta linea
Dim copia As New SqlBulkCopy(cadenaconexiondestino, SqlBulkCopyOptions.KeepIdentity
me sale que cadenaconexiondestino no se puede convertir en string, gracias de antemano
muy bueno pero lo necesito para oracle
Estimado esta utilidad es exclusiva desde .NET utilizando SQL Server.
Puedes ver el comentario en la documentacion asociada.
http://msdn.microsoft.com/es-es/library/system.data.sqlclient.sqlbulkcopy(v=vs.80).aspx
Si alguien encontro la utilidad en ORACLE, favor enviarlo.
Wow this is a great resource.. I’m enjoying it.. good article
Hi there, I uncovered your internet site via Google, your article looks totally interesting for me.
Puedo hacer pero al revez, un select de una tabla a excel.. con interlop va muy lento… gracias por la respuesta
muy buen articulo gracias
muchas gracias!! nos ha sido de gran utilidad!!
thank you very much for your view,it’s very helpfu
Amigo es lo que estaba buscando,Gracias, mañana he de probar el codigo.
Hola, he buscado por todo internet y muestran este ejemplo, pero yo teng una duda, existe la forma de que en el momento de copiado se cree la tabla de destino, puesto que para utilzar este ejemplo debe existir las dos tablas, destino y origen y yo busco el caso donde solo exista la tabla de origen y que en el momento de copiado se cree la de destino
Puedes crearla construyendo un dataset y exportandolo a pa bd esto necesitas permisos elevados para que temgas en cuenta
Hola, muy buen articulo en mi caso lo uso con c# solo he tenido algunas dudas sobre la propiedad BatchSize he leido algunas recomendaciones pero no se cual seria el valor recomendable 🙁
En https://www.inforcustom.duckdns.org/es-es podéis encontrar una aplicación que os permitirá copiar una Base de Datos entera o parte desde un origen a otro. Utiliza SqlBulkCopy en paralelo con el fin de optimizar los recursos hardware y no es dependiente de la lógica de negocio implementada en la base de datos.
En https://www.inforcustom.duckdns.org/es-es/documentacion/insertbulkbestia/ibbintroduccion podéis encontrar la documentación y en https://www.inforcustom.duckdns.org/es-es/productos/aplicacioneslicencias/aplicacioncontipolicencia la podéis descargar.
aun con los imports:
Imports System.Data.SqlClient
Imports System.Data.Sql
no puedo instanciar SqlBulkCopy:
dim copia As New SqlBulkCopy(Conexion)
Agradezco su apoyo.
Lo siento, hace a;os no toco VB.net y depronto cambiaron muchas cosas, revisa la documentacion oficial
https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlbulkcopy?view=dotnet-plat-ext-6.0