Archive

Archive for 23 noviembre 2009

Que hay del Visual studio 2010?

noviembre 23, 2009 Deja un comentario

Hola a todos quisiera preguntarles que opinan del visual studio 2010, ha recibido muchas críticas de parte y parte.

La mayoría aseguran que esta es una versión con muchas mejoras y que nos hará la vida mucho más fácil a todos los desarrolladores para grandes proyectos de software. Sin embargo para las empresas sobretodo las Pymes es muy precipitada una nueva versión de la plataforma, estar comprando licencias es muy costoso y estar capacitando a los empleados resulta ser algo tedioso y costoso.

Que opinan ustedes?? Por favor dejen su comentario y respondan la encuesta.


 

 

Copiado masivo de datos utilizando la clase SqlBulkCopy y Visual basic .NET

noviembre 23, 2009 12 comentarios

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.