none
Como pasar una imagen almacenada en un campo de una base de datos SQL Server a otra base de datos RRS feed

  • Pregunta

  • Tengo la tarea de migrar los datos de una base de datos de SQL Server 2012 a otra con igual estructura pero que está en otro servidor. No puedo hacerlo desde el servidor principal y la única opción que me quedó es migrar registro a registro mediante una aplicación de VB.NET diseñada para migrar los datos. Todo iba bien hasta que me encontré con las imágenes y los documentos. Sucede que en algunas tablas hay un campo que almacena en bytes las imágenes y en otro campo nChar la extensión de la imagen, igual sucede con los documentos. Les agradecería muchísimo si pudieran ayudarme. Debo pasar los datos del campo en donde se almacenan los bytes de las imágenes y los documentos a la otra base de datos y que queden exactamente igual que como están en la base de datos principal, pero usando VB.NET.


    lunes, 13 de julio de 2015 21:26

Respuestas

  • Los campos de imagen se pasan exactamente igual que cualquier otro. Lo único que hay que tener en cuenta es que en VB en lugar de ser de tipo String o Integer (por ejemplo), son de tipo Byte(), es decir, "Array de bytes". Pero por lo demás es igual, simplemente lees de la base original ese campo a un array de bytes y luego el array de bytes lo grabas en la de destino, y el campo pasará exactamente igual que si estuvieses leyendo un varchar a un String.

    Pero esta es una forma excesivamente compleja de migrar la base de datos. Bastaría con que uses el asistente para copiar bases de datos desde SSMS y le digas que lea desde la original y grabe en la de destino. O el Asistente para importar y Exportar, que también puede hacerlo. O podrías usar la opción de "generar scripts" en el servidor de origen, pedirle en "opciones avanzadas" que genere script para datos, y una vez que tengas el script ejecutarlo en la base de destino. También podrías añadir un "linked server" en el servidor de destino y hacer un "select ... into..." para mover todos los datos de la tabla (imágenes incluidas) con una única sentencia. Como ves, hay cantidad de opciones para trasladar los datos sin necesidad de escribir un programa que lo haga.

    martes, 14 de julio de 2015 5:57

Todas las respuestas

  • Los campos de imagen se pasan exactamente igual que cualquier otro. Lo único que hay que tener en cuenta es que en VB en lugar de ser de tipo String o Integer (por ejemplo), son de tipo Byte(), es decir, "Array de bytes". Pero por lo demás es igual, simplemente lees de la base original ese campo a un array de bytes y luego el array de bytes lo grabas en la de destino, y el campo pasará exactamente igual que si estuvieses leyendo un varchar a un String.

    Pero esta es una forma excesivamente compleja de migrar la base de datos. Bastaría con que uses el asistente para copiar bases de datos desde SSMS y le digas que lea desde la original y grabe en la de destino. O el Asistente para importar y Exportar, que también puede hacerlo. O podrías usar la opción de "generar scripts" en el servidor de origen, pedirle en "opciones avanzadas" que genere script para datos, y una vez que tengas el script ejecutarlo en la base de destino. También podrías añadir un "linked server" en el servidor de destino y hacer un "select ... into..." para mover todos los datos de la tabla (imágenes incluidas) con una única sentencia. Como ves, hay cantidad de opciones para trasladar los datos sin necesidad de escribir un programa que lo haga.

    martes, 14 de julio de 2015 5:57
  • Muchas gracias por la respuesta tan rápida.  Todas las opciones que das para migrar los datos son muy funcionales y permiten hacerlo de manera eficiente, sin embargo el mio es un caso un poco difícil, lo que pasa es que la base de datos es un poco compleja y la genera de manera automática un Software especial; cada vez que se genera un proyecto nuevo, aunque sea exacto al anterior, le asigna id's y nombres diferentes a campos muy particulares de tablas que usa para realizar controles de manera interna (Está hecho en .net, pero se compró solo la licencia y no tengo acceso al código para ver que lógica usa para hacer esas operaciones). Alguien cambió algún valor en algún campo de alguna tabla de la base de datos del proyecto y eso hace que el proyecto no lleve a cabo algunas funciones necesarias. De manera que hacer una copia exacta no me funciona. Después de analizar todas las posibilidades opté por escribir un programa que me migre los datos insertados por el usuario en el proyecto dañado y dejar que el Software que se adquirió me genere el resto para evitar pasar el valor del campo que da problemas, por eso no puedo usar ninguna de esas funciones.

    Sin embargo, lo que dices con respecto a los "Array de bytes" no lo he probado, creo que ahí podría estar la solución. Voy a probarlo de inmediato.

    De nuevo muchas gracias.

    martes, 14 de julio de 2015 14:27
  • Ya probé la solución que planteó Alberto y me funcionó a la perfección.

    Únicamente hay que tomar en cuenta que la consulta "UPDATE" debe hacerse usando parámetros para que no genere un error.

    Muchas gracias por la ayuda.

    martes, 14 de julio de 2015 20:51