2010-02-02 44 views
7

Voy a guardar imágenes en una base de datos SQL (no sé qué tipo usar allí), y voy a consultar la base de datos para obtener una imagen de una foto de retrato de un estudiante.¿Qué tipo de variable debo usar para guardar una imagen?

¿Qué tipo de variable debo usar para almacenar esta imagen?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Nana_s_Student_Gradebook 
{ 
    class Student 
    { 
     public string name { get; set; } 
     public string lastName { get; set; } 
     public byte[] picture { get; set; } 
     public DateTime dateOfBirth { get; set; } 
    } 
} 

¿Alguna orientación, por favor? :)

Respuesta

7

En el lado de SQL Server, use un tipo VARBINARY(MAX) - es binario, tiene hasta 2 GB de tamaño, es rápido, es perfecto para ese caso de uso. Hasta un tamaño de imagen promedio de aproximadamente 1 MB, esta es probablemente la mejor opción, incluso mejor que usar el atributo SQL Server 2008 FILESTREAM (que es genial si tienes muchas imágenes muy grandes, más grandes que 1 MB de forma regular). ; aquí, el archivo binario se almacena en el sistema de archivos de la máquina del servidor bajo el control de la base de datos).

En su código .NET, es probable que desee utilizar Image o una clase derivada; en última instancia, deberá transmitir esos bytes a SQL Server de una manera u otra, pero no necesita usar una matriz de bytes desde el principio: todos los tipos relacionados con imágenes en .NET ofrecen algún tipo de soporte de transmisión.

+0

Estoy creando mi aplicación usando WPF; el espacio de nombres utilizado debe ser: Usar System.Drawing; ¿derecho? –

+0

@Sergio: sí, la clase 'Image' está en System.Drawing. –

0
+0

¿Puedes guardarlos en una base de datos? ¿No tienes que guardarlo en un byte [] de alguna manera, primero? –

+0

Sí, primero tendría que cambiar mi imagen en una matriz de bytes [] antes de pasarla a mi base de datos. –

+0

Estaba más preocupado con la estructura de datos que pusiste. Una vez que lea los bytes de la base de datos, usaría el método Image.FromStream() para leer en los bytes (usando un flujo de memoria o equivalente). Para almacenar de nuevo en la base de datos, puede volver a escribir la imagen en bytes. Pero para la lógica interna, no llevaría una matriz de bytes. Eso es de uso limitado. – Nick

0

lo tienes correcta - utilizar una matriz de bytes en su clase. Para imágenes de menos de 1 MB, use una columna varbinary (max) en el servidor SQL. Si las imágenes tienen más de 1 MB y está utilizando SQL Server 2008, considere usar una columna FILESTREAM.

Puede usar la tabla en this MSDN page para hacer referencia a las asignaciones de tipos de datos C#/Sql.

0

Considere almacenar la imagen como un archivo y luego haga referencia al nombre de archivo en el DB, no a los datos binarios en sí. Esto tiene varias ventajas, como permitirle almacenar imágenes en otros servidores y reducir la carga/tráfico en el servidor SQL.

Cuestiones relacionadas