Cómo mostrar una imagen de una base de datos en un PictureBox de formularios Windows Forms mediante Visual Basic .NET

Seleccione idioma Seleccione idioma
Id. de artículo: 321900 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo paso a paso se describe cómo mostrar una imagen que se almacena en una base de datos en un control PictureBox en un formulario Windows Forms.

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 los datos de objeto binario grande (BLOB) en un archivo, es enlazar el control PictureBox a un origen de datos como un control de datos de ActiveX Data Objects (ADO) o el objeto Recordset . Sin enlace de datos, no puede cargar mediante programación un BLOB en un control sin guardar la imagen en un archivo para la instrucción LoadPicture para que utilice.

El ejemplo en este artículo utiliza una matriz de bytes y el objeto MemoryStream de la clase base System.IO para copiar los datos de imagen de la base de datos directamente desde un objeto ADO.NET DataSet o DataReader para el control PictureBox .

Requisitos

En la lista siguiente se describe el hardware, el software, la infraestructura de red y los Service Packs recomendados que necesitará:
  • Microsoft Visual Studio .NET instalado en un sistema operativo compatible con Microsoft Windows
  • 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 Windows Forms de Visual Basic .NET
  • Acceso a los datos de ADO.NET
  • Almacenamiento de objeto binario grande (BLOB) en bases de datos

Crear el ejemplo de Visual Basic .NET

  1. Crear una tabla de SQL Server o una tabla de Access con la siguiente estructura:
    CREATE TABLE BLOBTest
    (
    BLOBID INT IDENTITY NOT NULL,
    BLOBData IMAGE NOT NULL
    )
    					
  2. Siga estos pasos para crear un nuevo Visual Basic de Windows Forms aplicación:
    1. Inicie Visual Studio NET..
    2. En el menú archivo , seleccione nuevo y, a continuación, haga clic en proyecto .
    3. En el cuadro de diálogo Nuevo proyecto , haga clic en Proyectos de Visual Basic bajo Tipos de proyecto y, después, haga clic en Aplicación para Windows en plantillas .
  3. Arrastre un control PictureBox y dos controles Button desde el cuadro de herramientas al formulario predeterminado, Form1. Cambie la propiedad Name de PictureBox a picBlob . Establezca la propiedad Text de Button1 a un archivo a la base de datos y, a continuación, establezca la propiedad Text de Button2 a base de datos a PictureBox .
  4. Agregue las siguientes instrucciones Imports al principio del módulo de código de Form1:
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.IO
    Imports System.Drawing.Imaging
    					
  5. Agregar la siguiente declaración de la cadena de conexión de base de datos debajo de Public Class Form1 y, a continuación, modificar la cadena de conexión según sea necesario para su entorno:
        Dim strCn As String = "Data Source=<server>;" & _
                "Initial Catalog=<database>;Integrated Security=SSPI"
    					
  6. Agregar el código siguiente en el procedimiento de evento Click de Button1 y modifique la ruta de acceso de archivo a un archivo de imagen de ejemplo disponibles según sea necesario:
            Dim cn As New SqlConnection(strCn)
            Dim cmd As New SqlCommand("INSERT INTO BLOBTest (BLOBData) " & _
                "VALUES (@BLOBData)", cn)
            Dim strBLOBFilePath As String = _
                "C:\Documents and Settings\All Users\Documents" & _
                "\My Pictures\Sample Pictures\winter.jpg"
            Dim fsBLOBFile As New FileStream(strBLOBFilePath, _
                FileMode.Open, FileAccess.Read)
            Dim bytBLOBData(fsBLOBFile.Length() - 1) As Byte
            fsBLOBFile.Read(bytBLOBData, 0, bytBLOBData.Length)
            fsBLOBFile.Close()
            Dim prm As New SqlParameter("@BLOBData", SqlDbType.VarBinary, _
                bytBLOBData.Length, ParameterDirection.Input, False, _
                0, 0, Nothing, DataRowVersion.Current, bytBLOBData)
            cmd.Parameters.Add(prm)
            cn.Open()
            cmd.ExecuteNonQuery()
            cn.Close()
    						
    este código se utiliza un objeto FileStream para leer el archivo de imagen de disco a una matriz de bytes y se utiliza a continuación, un objeto de comando parametrizado para insertar los datos en la base de datos.
  7. Agregue el código siguiente en el procedimiento de evento Click de Button2 :
            Dim cn As New SqlConnection(strCn)
            Dim cmd As New SqlCommand("SELECT BLOBID, " & _
                "BLOBData FROM BLOBTest ORDER BY BLOBID", cn)
            Dim da As New SqlDataAdapter(cmd)
            Dim ds As New DataSet()
            da.Fill(ds, "BLOBTest")
            Dim c As Integer = ds.Tables("BLOBTest").Rows.Count
            If c > 0 Then
                Dim bytBLOBData() As Byte = _
                    ds.Tables("BLOBTest").Rows(c - 1)("BLOBData")
                Dim stmBLOBData As New MemoryStream(bytBLOBData)
                picBLOB.Image = Image.FromStream(stmBLOBData)
            End If
    						
    este código recupera las filas de la tabla BLOBTest en la base de datos en un objeto DataSet , copia la imagen que es agregada más recientemente 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 .
  8. Ejecute el proyecto.
  9. Haga clic en File to Database para cargar al menos una imagen de ejemplo en la base de datos.
  10. Haga clic en Database to PictureBox para mostrar la imagen que guardó en el control PictureBox .
  11. Para recuperar la imagen en un objeto DataReader en lugar de un objeto DataSet , modifique el código del procedimiento de evento Click de Button2 como sigue:
            Dim cn As New SqlConnection(strCn)
            Dim cmd As New SqlCommand("SELECT BLOBID, " & _
                "BLOBData FROM BLOBTest ORDER BY BLOBID", cn)
            Dim dr As SqlDataReader
            cn.Open()
            dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
            If dr.Read Then
                Dim bytBLOBData(dr.GetBytes(1, 0, Nothing, 0, Integer.MaxValue) - 1) As Byte
                dr.GetBytes(1, 0, bytBLOBData, 0, bytBLOBData.Length)
                Dim stmBLOBData As New MemoryStream(bytBLOBData)
                picBLOB.Image = Image.FromStream(stmBLOBData)
            End If
            dr.Close()
    					
  12. Para insertar la imagen desde el control PictureBox directamente en la base de datos, agregue un tercer control Button ( Button3 ) al formulario. Establezca la propiedad Text de Button3 a PictureBox a la base de datos y, a continuación, agregue el código siguiente en el procedimiento de evento Click de Button3 :
            Dim cn As New SqlConnection(strCn)
            Dim cmd As New SqlCommand("INSERT INTO BLOBTest (BLOBData) " & _
                "VALUES (@BLOBData)", cn)
            Dim ms As MemoryStream = New MemoryStream()
            picBLOB.Image.Save(ms, ImageFormat.Jpeg)
            Dim bytBLOBData(ms.Length - 1) As Byte
            ms.Position = 0
            ms.Read(bytBLOBData, 0, ms.Length)
            Dim prm As New SqlParameter("@BLOBData", SqlDbType.VarBinary, _
                bytBLOBData.Length, ParameterDirection.Input, False, _
                0, 0, Nothing, DataRowVersion.Current, bytBLOBData)
            cmd.Parameters.Add(prm)
            cn.Open()
            cmd.ExecuteNonQuery()
            cn.Close()
    						
    este código recupera los datos de imagen del control PictureBox en un objeto MemoryStream , copia la MemoryStream en una matriz de bytes y, a continuación, utiliza un objeto de comando con parámetros para guardar la matriz de bytes en la base de datos.
  13. Ejecute el proyecto. Haga clic en Database to PictureBox para mostrar una imagen que guardó previamente en el control PictureBox .
  14. Haga clic en PictureBox a la base de datos para guardar la imagen de PictureBox en la base de datos y, a continuación, haga clic en Database to PictureBox nuevo para confirmar que la imagen se guarda correctamente.

Solución de problemas

  • Esta prueba no funciona con la columna Photo de la tabla Employees de la base de datos de ejemplo Northwind que se incluye con Access y SQL Server. Las imágenes de mapa de bits que se almacenan en la columna Photo se empaquetan con la información de encabezado que crea el control OLE de Visual Basic 6.0 contenedor .
  • Para 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, a continuación, utilice el espacio de nombres System.Data.OleDb con el proveedor de Microsoft Jet 4.0 en lugar del espacio de nombres System.Data.SqlClient .
  • Consumir muchos de sobrecarga de memoria si recupera todas las imágenes de una tabla en el DataSet . Para consumir menos sobrecarga, deje las imágenes de la base de datos y recuperar los uno cada vez que desplazarse por el DataSet . Para ello, ejecutar una consulta parametrizada para recuperar la imagen que desee en un DataReader y, a continuación, cargar la imagen del DataReader en PictureBox .

Referencias

Para obtener información adicional acerca de cómo utilizar datos BLOB con Visual Basic.NET, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
308042Cómo leer y escribir datos BLOB utilizando ADO.NET con Visual Basic .NET
316887Cómo leer y escribir un archivo a y desde una BLOB utilizando ADO.NET y Visual Basic .NET

Propiedades

Id. de artículo: 321900 - Última revisión: jueves, 15 de julio de 2004 - Versión: 2.2
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 Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
Palabras clave: 
kbmt kbhowtomaster kbsqlclient kbsystemdata KB321900 KbMtes
Traducció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): 321900

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com