Principales respuestas
Insertar imagen en base de datos

Pregunta
-
Hola a todos! Tengo una tabla con un campo image. Cómo puedo hacer para que utilizando sentencias SQL pueda insertar una imagen en ese campo?
miércoles, 22 de junio de 2016 15:25
Respuestas
-
Almacenar datos no estructurados en el sistema de archivos y una referencia (ruta + nombre) en una tabla es una opción pero no por ello convierte en mala practica almacenar el medio como un array de bytes, ¿por qué?
Tomar una o otra opción pasa por estudiar el caso y tomar la mejor decisión, yo no recomendaría almacenarlo en el sistema de archivos (recurso compartido) porque el medio se encuentra expuesto a los usuarios -inconveniente si se trata de datos confidenciales-, o migrar de ubicación los datos resulta que también tengas que actualizar los valores en la tabla, entre otras desventajas.
La opción sobre image es utilizar un tipo varbinary(max) para almacenar los bytes de los datos no estructurados, pero en caso no sea suficiente se puede hacer uso de FILESTREAM, mantienes la columna de tipo varbinary() pero los datos son almacenados como BLOB en el sistema de archivos.
- Propuesto como respuesta Guzmán Díaz Celso JavierMVP miércoles, 22 de junio de 2016 17:41
- Marcado como respuesta José De Alva miércoles, 29 de junio de 2016 20:03
miércoles, 22 de junio de 2016 17:14
Todas las respuestas
-
Para arrancar amigo, te recomiendo que que uses algun tipo de arquitectura para almacenar BLoB. Para arrancar tenes que usar tipos de datos varbinary(Max). Despues creo un filegroup donde voy a guardar los BLOG y separo la tabla transaccional de la tabla BloB. Una vez armada la arqutectura vamos con los comandos para insertar
Working with Large Value Types
Carlos Ignacio Aguero. DBA SQL Server. Toda mi respeto al pueblo Peruano por la ayuda prestada en la guerra de Malvinas.
miércoles, 22 de junio de 2016 15:37 -
Puedes hacer uso del tipo de dato Image, para esto debes conviertir la imagen en un arreglo de bytes.
Talves este ejemplo te sirva:
Insertar una imagen en bases de datos SQL Server 2008 con visual studio 2008
Saludos.
- Editado José De Alva miércoles, 29 de junio de 2016 20:03 url-
miércoles, 22 de junio de 2016 15:46 -
Ten en cuenta que el tipo de dato Imagen sera quitado en las versiones furutas de SQL Server y se usara Varbinary(Max)
Carlos Ignacio Aguero. DBA SQL Server. Toda mi respeto al pueblo Peruano por la ayuda prestada en la guerra de Malvinas.
miércoles, 22 de junio de 2016 16:02 -
Mi idea era utilizar algo parecido a esto:
UPDATE dbo.ImagenesZoo SET ImagenKoala = (SELECT BulkColumn FROM OPENROWSET (BULK 'C:\Users\YO\Documents\Koala.jpg', SINGLE_BLOB) AS ImagenKoala) WHERE Id = 3
El problema es que al ejecutar esta sentencia, el SQL Server me devuelve el siguiente error:
No se puede realizar la carga masiva. El archivo "C:\Users\YO\Documents\Koala.jpg" no se puede abrir. Código de error del sistema operativo: 3(El sistema no puede encontrar la ruta especificada.).
Cómo puedo solucionarlo?
Un saludo.
miércoles, 22 de junio de 2016 16:11 -
El error es claro,
El sistema no puede encontrar la ruta especificada
fijate que esta poniendo mal la ruta
Carlos Ignacio Aguero. DBA SQL Server. Toda mi respeto al pueblo Peruano por la ayuda prestada en la guerra de Malvinas.
miércoles, 22 de junio de 2016 16:28 -
Hola;
Nosotros teníamos un inconveniente con esto, no es una buena practica almacenar un archivo multimedia en nuestra base de datos, para ello mejor usamos una carpeta compartida donde solo guardábamos la referencia al archivo en cuestión.
Saludos.
Celso Javier Guzmán Díaz
Blog Tecnico: https://elcegu.wordpress.commiércoles, 22 de junio de 2016 16:50 -
Almacenar datos no estructurados en el sistema de archivos y una referencia (ruta + nombre) en una tabla es una opción pero no por ello convierte en mala practica almacenar el medio como un array de bytes, ¿por qué?
Tomar una o otra opción pasa por estudiar el caso y tomar la mejor decisión, yo no recomendaría almacenarlo en el sistema de archivos (recurso compartido) porque el medio se encuentra expuesto a los usuarios -inconveniente si se trata de datos confidenciales-, o migrar de ubicación los datos resulta que también tengas que actualizar los valores en la tabla, entre otras desventajas.
La opción sobre image es utilizar un tipo varbinary(max) para almacenar los bytes de los datos no estructurados, pero en caso no sea suficiente se puede hacer uso de FILESTREAM, mantienes la columna de tipo varbinary() pero los datos son almacenados como BLOB en el sistema de archivos.
- Propuesto como respuesta Guzmán Díaz Celso JavierMVP miércoles, 22 de junio de 2016 17:41
- Marcado como respuesta José De Alva miércoles, 29 de junio de 2016 20:03
miércoles, 22 de junio de 2016 17:14 -
Lo que tu indicas dista mucho a veces de lo que tenemos en Producción;
Las carpetas compartida se pueden restringir por permisos (NTFS) ademas de que nadie va a saber con que nombre esta mi Server Files, yo puedo migrar por ejemplo 100 fotos moverlos de servidor pero por DNS puede seguir teniendo el mismo nombre y no tener que modificar la columna que tiene almacenada el Array (te lo digo porque aquí ya lo he hecho). Lo que tu indicas es depende de los escenarios que hemos tenido y sobre todo la experiencia en ello pero hay muchas opciones ya depende de cada uno cual tomar.
Es buena la opción que tu indicas, lo probare en Desarrollo.
Saludos.
Celso Javier Guzmán Díaz
Blog Tecnico: https://elcegu.wordpress.commiércoles, 22 de junio de 2016 17:41