Id. de artículo: 317701 - Última revisión: lunes, 05 de abril de 2004 - Versión: 2.5

Cómo: Copiar una imagen de una base de datos directamente a un Control PictureBox con C#

En esta página

Expandir todo | Contraer todo

Resumen

En este artículo paso a paso describe cómo copiar una imagen almacenada en una base de datos directamente en un control PictureBox en un formulario Windows Forms sin necesidad de guardar la imagen en un archivo.

En Microsoft Visual Basic 6.0, la única manera de mostrar una imagen de una base de datos en un control PictureBox , sin el paso intermedio de guardar el objeto binario grande {BLOB) datos en un archivo es enlazar el control PictureBox a un origen de datos, como un control de datos de ActiveX Data Objects (ADO) o Recordset. No hay ninguna manera (sin el enlace de datos) cargar mediante programación un BLOB en un control sin guardar la imagen en un archivo para su uso por la instrucción LoadPicture.

En este artículo, utilizaremos el objeto MemoryStream de la clase base System.IO para copiar los datos de imagen de la base de datos directamente en el control PictureBox .


Requisitos

La lista siguiente describe el hardware, el software, la infraestructura y los service pack recomendados que se necesitarán:
  • Microsoft Visual Studio .NET instalado en un sistema operativo compatible con Microsoft Windows
  • Una instancia disponible de Microsoft SQL Server o una base de datos disponible de Microsoft Access para probar
En este artículo se supone que está familiarizado con los temas siguientes:
  • Aplicaciones de C# .NET Windows Forms visuales
  • Almacenamiento de objeto binario grande (BLOB) en bases de datos
  • Acceso a los datos de ADO.NET

Ejemplo

  1. Crear una tabla SQL Server o Access con la estructura siguiente:
    CREATE TABLE BLOBTest
    (
    BLOBID INT IDENTITY NOT NULL,
    BLOBData IMAGE NOT NULL
    )
    					
  2. Abra Visual Studio .NET y cree un nuevo proyecto de aplicación de Windows de Visual C#.
  3. Agregar un PictureBox y dos controles Button a la predeterminada Form1 en el cuadro de herramientas. Establezca la propiedad Text de Button1 para archivos de base de datos y la propiedad Text de Button2 a Database to PictureBox .
  4. Inserte las siguientes instrucciones using al principio del módulo de código del formulario:
    using System.Data.SqlClient;
    using System.IO;
    using System.Drawing.Imaging;
    					
  5. Agregue la declaración siguiente la cadena de conexión de base de datos sólo en el public class Form1: System.Windows.Forms.Form declaración de clase y ajustar la cadena de conexión según sea necesario:
        String strCn = "Data Source=localhost;integrated security=sspi;initial catalog=mydata";
    					
  6. Inserte el código siguiente en el procedimiento de evento Click de Button1 ( File to Database ). Ajustar la ruta de acceso archivo a un archivo de imagen de ejemplo disponibles según sea necesario. Este código lee el archivo de imagen de disco (mediante un objeto FileStream ) en una matriz de bytes y, a continuación, inserta los datos en la base de datos mediante un objeto comando parametrizado.
    try
    {
    	SqlConnection cn = new SqlConnection(strCn);
    	SqlCommand cmd =  new SqlCommand("INSERT INTO BLOBTest (BLOBData) VALUES (@BLOBData)", cn);
    	String strBLOBFilePath = @"C:\blue hills.jpg";//Modify this path as needed.
    
    	//Read jpg into file stream, and from there into Byte array.
    	FileStream fsBLOBFile =  new FileStream(strBLOBFilePath,FileMode.Open, FileAccess.Read);
    	Byte[] bytBLOBData = new Byte[fsBLOBFile.Length]; 
    	fsBLOBFile.Read(bytBLOBData, 0, bytBLOBData.Length);
    	fsBLOBFile.Close();
    
    	//Create parameter for insert command and add to SqlCommand object.
    	SqlParameter prm = new  SqlParameter("@BLOBData", SqlDbType.VarBinary, bytBLOBData.Length, ParameterDirection.Input, false, 
    				0, 0, null, DataRowVersion.Current, bytBLOBData);
    	cmd.Parameters.Add(prm);
    
    	//Open connection, execute query, and close connection.
    	cn.Open();
    	cmd.ExecuteNonQuery();
    	cn.Close();
    }catch(Exception ex)
    {MessageBox.Show(ex.Message);}
    					
  7. Inserte el código siguiente en el procedimiento de evento Click de Button2 ( Database to PictureBox ). Este código recupera las filas de la tabla BLOBTest en la base de datos en un DataSet , copia el recientemente agregado imagen en una matriz de bytes y, a continuación, en un objeto MemoryStream y, a continuación, carga MemoryStream en la propiedad Image del control PictureBox .
    try
    {
    	SqlConnection cn = new SqlConnection(strCn);
    	cn.Open();
    
    	//Retrieve BLOB from database into DataSet.
    	SqlCommand cmd = new SqlCommand("SELECT BLOBID, BLOBData FROM BLOBTest ORDER BY BLOBID", cn);	
    	SqlDataAdapter da = new SqlDataAdapter(cmd);
    	DataSet ds = new DataSet();
    	da.Fill(ds, "BLOBTest");
    	int c = ds.Tables["BLOBTest"].Rows.Count;
    
    	if(c>0)
    	{   //BLOB is read into Byte array, then used to construct MemoryStream,
    		//then passed to PictureBox.
    		Byte[] byteBLOBData =  new Byte[0];
    		byteBLOBData = (Byte[])(ds.Tables["BLOBTest"].Rows[c - 1]["BLOBData"]);
    		MemoryStream stmBLOBData = new MemoryStream(byteBLOBData);
    		pictureBox1.Image= Image.FromStream(stmBLOBData);
    	} 
    	cn.Close();
    }
    catch(Exception ex)
    {MessageBox.Show(ex.Message);}
    					
  8. Presione F5 para compilar y ejecutar el proyecto.
  9. Haga clic en el botón de archivo a la base de datos para cargar al menos una imagen de ejemplo en la base de datos.
  10. Haga clic en el botón Database to PictureBox para mostrar la imagen guardada en el control PictureBox .
  11. Si desea ser capaz de insertar la imagen desde el control PictureBox directamente en la base de datos, agregue un tercer control Button e inserte el código siguiente en su procedimiento de evento Click. Este código recupera los datos de imagen desde el control PictureBox en un objeto MemoryStream , copia MemoryStream en una matriz de bytes y a continuación, guarda la matriz de bytes en la base de datos mediante un objeto de comando parametrizado.
    try
    {
    	SqlConnection cn = new SqlConnection(strCn);
    	SqlCommand cmd = new SqlCommand("INSERT INTO BLOBTest (BLOBData) VALUES (@BLOBData)", cn);
    
    	//Save image from PictureBox into MemoryStream object.
    	MemoryStream ms  = new MemoryStream();
    	pictureBox1.Image.Save(ms, ImageFormat.Jpeg);
    
    	//Read from MemoryStream into Byte array.
    	Byte[] bytBLOBData = new Byte[ms.Length];
    	ms.Position = 0;
    	ms.Read(bytBLOBData, 0, Convert.ToInt32(ms.Length));
    
    	//Create parameter for insert statement that contains image.
    	SqlParameter prm = new SqlParameter("@BLOBData", SqlDbType.VarBinary, bytBLOBData.Length, ParameterDirection.Input, false, 
    					0, 0,null, DataRowVersion.Current, bytBLOBData);
    	cmd.Parameters.Add(prm);
    	cn.Open();
    	cmd.ExecuteNonQuery();
    	cn.Close();
    }catch(Exception  ex)
     {MessageBox.Show(ex.Message);}
    					
  12. Ejecute el proyecto. Haga clic en el botón Database to PictureBox para mostrar una imagen guardada anteriormente en el control PictureBox . Haga clic en el botón recién agregado para guardar la imagen desde el control PictureBox en la base de datos. Haga clic en el botón Database to PictureBox para confirmar que la imagen se guardó correctamente.

Errores

  • Esta prueba no funcionará con la columna Photo en la tabla Employees de la base de datos de ejemplo Northwind distribuida con Access y SQL Server. Las imágenes de mapa de bits almacenadas en la columna Photo se empaquetan con la información de encabezado creada por el control OLE Container de Visual Basic 6.0.
  • Si necesita utilizar una base de datos de Access para probar este código, debe crear la columna en la tabla de Access como tipo Objeto OLE y utilizar el espacio de nombres System.Data.OleDb con el proveedor Microsoft Jet 4.0 en lugar del espacio de nombres System.Data.SqlClient .

Referencias

Para obtener información adicional sobre cómo utilizar datos BLOB con Visual C#. NET, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
309158  (http://support.microsoft.com/kb/309158/ ) Cómo: Leer y escribir datos BLOB utilizando ADO.NET con Visual C# .NET
317016  (http://support.microsoft.com/kb/317016/ ) Cómo leer y escribir un archivo a o desde una columna BLOB utilizando ADO.NET y Visual C# .NET

La información de este artículo se refiere a:
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
Palabras clave: 
kbmt kbdatabinding kbhowtomaster KB317701 KbMtes
Traducción automáticaTraducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 317701  (http://support.microsoft.com/kb/317701/en-us/ )
 

Seleccione idioma