Imágenes en SQL Server
[Con Visual Basic .NET]

Fecha: 06/Mar/2005 (5 de Marzo 2005)
Autor: Juan Gabriel Castillo Turrubiates jgcastillo@uat.edu.mx

 


A continuación veremos la forma de almacenar Imagenes en SQL Server
Comencemos...

Lo primero que debemos hacer es crear la Base de datos, la cual, para este ejemplo se llama dbImages. Depués creamos una tabla de la siguiente manera:

Una vez creada la tabla, procedemos a crear un procedimiento almacenado como se muestra:

CREATE PROCEDURE [dbo].[CARGA_FOTO]
(
@ID_CLIENTE NVARCHAR(50),
@IMAGEN image
)
AS
UPDATE
CAT_CLIENTES
SET FOTO = @IMAGEN
where ID_CLIENTE = @ID_CLIENTE
GO

Después creamos un proyecto de Visual Basic .NET; en mi caso le asigné el nombre proImages.

Agrega a un formulario (frmCatClientes) dos Labels y dos TextBox y un PictureBox con las siguientes características:

OBJETO(Nombre) PROPIEDAD VALOR
lblID_CLIENTE Text Clave
txtID_CLIENTE Text (vacío)
lblNOMBRE Text Nombre
txtNOMBRE Text (vacío)
picFoto SizeMode StretchImage
  BorderStyle FixedSingle

Hasta aqui todo va bien, veamos el código del formulario (es el código completo):


'Las imports
Imports System.Data
Imports System.Data.OleDb
Imports System.IO
Imports System.Text
'Declaraciones
    Inherits System.Windows.Forms.Form
    ''una instancia a la clase clsMain
    ''Declaramos una conexión
    Dim CnnStr As String = "Provider=SQLOLEDB.1; " & _
            "Password=thekinmsn;" & _
            "Persist Security Info=True;" & _
            "User ID=sa;" & _
            "Initial Catalog=dbImages;" & _
            "Data Source=(local)"
    Dim cnnCatClientes As New OleDbConnection(CnnStr)
    ''DEclaramos un Comando
    Dim cmdCatClientes As New OleDbCommand _
    ("SELECT ID_CLIENTE,NOMBRE " & _
    "FROM CAT_CLIENTES", cnnCatClientes)
    ''DEclaramos un Data Adapter
    Dim daCatClientes As New OleDbDataAdapter(cmdCatClientes)
    ''Un DataSet
    Dim dsCatClientes As New DataSet()
    ''''y por último, el importantisimo Command Builder
    Dim cbCatClientes As New OleDbCommandBuilder(daCatClientes)
    '''''''''''''''

    Private Sub frmCatClientes_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        HabilitaBotones(True)
        HabilitaCaptura(False)
        Inicializar()
        CargarImagen(txtID_CLIENTE.Text)
    End Sub
    Private Sub Actualizar()
        Try
            dsCatClientes.Clear() 'Limpiar el DataSet
            daCatClientes.Fill(dsCatClientes, "CAT_CLIENTES")
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Información del sistema", _
            MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
    Private Sub Inicializar()
        Try
            With cnnCatClientes
                ''Verificamos el estado de la conoexión
                If .State = 1 Then 'si esta abierta
                    .Close()    'cerramos
                End If
                .Open() '' abrimos la conexion
            End With
            ''Cargamos el DataSet Con los datos de La tabla
            daCatClientes.Fill(dsCatClientes, "CAT_CLIENTES")
            ''Enlazamos los Objetos
            txtID_CLIENTE.DataBindings.Add("Text", dsCatClientes, _
                "CAT_CLIENTES.ID_CLIENTE")
            txtNombre.DataBindings.Add("Text", dsCatClientes, _
                "CAT_CLIENTES.NOMBRE")
        Catch ex As Exception
            ''Esto ocurriría solo en el caso de que ocurra un error
            MessageBox.Show(ex.Message, "Info del Sistema", _
            MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
    Private Sub Nuevo()
        Try
            'Indicamos que termine la edición actual
            Me.BindingContext(dsCatClientes, _
            "CAT_CLIENTES").EndCurrentEdit()
            'Preparamos al DataSet para aceptar un Registro nuevo
            Me.BindingContext(dsCatClientes, "CAT_CLIENTES").AddNew()
            HabilitaBotones(False)
            HabilitaCaptura(True)
        Catch ex As Exception
            MsgBox(ex.Source & "; " & ex.Message)
        End Try
    End Sub
    Private Sub Eliminar()
        ''Este procedimiento es el encargado de eliminar un registro.
        ''Lo que hacemos es obtener la posisición en la que nos encontramos
        ''Y después eliminamos el registro que se encuentra en esa posición
        ''Otra manera de eliminar seria ejecutar una instrucción SQL que
        ''elimine el registro (de acuerdo con la ID_CLIENTE)
        ''y después ejecutar el procedimiento Inicializar.
        Dim Resp As String
        Try
            Resp = MsgBox("¿Esta seguro de eliminar el registro? " & _
            vbCrLf & "Nota: Eliminar registros puede perjudicar " & _
            "la ejecución.", MsgBoxStyle.OKCancel, "Eliminar Registro")
            If Resp = vbOK Then
                Dim Registro As Integer
                Registro = Me.BindingContext(dsCatClientes, _
                    "CAT_CLIENTES").Position
                Me.BindingContext(dsCatClientes, _
                    "CAT_CLIENTES").EndCurrentEdit()
                Me.BindingContext(dsCatClientes, _
                    "CAT_CLIENTES").RemoveAt(Registro)
                daCatClientes.Update(dsCatClientes, "CAT_CLIENTES")
                Me.BindingContext(dsCatClientes, _
                    "CAT_CLIENTES").Position = 0
            End If
        Catch ex As Exception
            MsgBox(ex.Source & "; " & ex.Message, _
            MsgBoxStyle.OKOnly, "Ocurrió un error")
        End Try
    End Sub
    Private Sub Cancelar()
        Try
            'Cancelamos
            Me.BindingContext(dsCatClientes, _
                "CAT_CLIENTES").CancelCurrentEdit()
            HabilitaBotones(True)
            HabilitaCaptura(False)
        Catch ex As Exception
            MsgBox(ex.Source & "; " & ex.Message, _
            MsgBoxStyle.OKOnly, "Ocurrió un error")
        End Try
    End Sub
    Private Sub HabilitaBotones(ByVal Habilitar As Boolean)
        btnInicio.Enabled = Habilitar
        btnAnterior.Enabled = Habilitar
        btnSiguiente.Enabled = Habilitar
        btnFinal.Enabled = Habilitar
        btnNuevo.Enabled = Habilitar
        btnModificar.Enabled = Habilitar
        btnEliminar.Enabled = Habilitar
        btnBuscar.Enabled = Habilitar
        btnActualizar.Enabled = Habilitar
        btnImprimir.Enabled = Habilitar
        btnGrabar.Enabled = Not Habilitar
        btnCancelar.Enabled = Not Habilitar
        btnSalir.Enabled = Habilitar

    End Sub
    Private Sub HabilitaCaptura(ByVal Habilitar As Boolean)
        txtID_CLIENTE.Enabled = Habilitar
        txtNombre.Enabled = Habilitar
    End Sub
    Private Sub barBotones_ButtonClick(ByVal sender As System.Object, _
    ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) _
    Handles barBotones.ButtonClick
        Select Case barBotones.Buttons.IndexOf(e.Button)
            Case Is = 0
                Try
                    Me.BindingContext(dsCatClientes, "CAT_CLIENTES").Position = 0
                    CargarImagen(txtID_CLIENTE.Text)
                Catch ex As Exception
                    MsgBox(ex.Source & "; " & ex.Message)
                End Try
            Case Is = 1
                Try
                    Me.BindingContext(dsCatClientes, "CAT_CLIENTES").Position -= 1
                    CargarImagen(txtID_CLIENTE.Text)
                Catch ex As Exception
                    MsgBox(EX.Source & "; " & EX.Message)
                End Try
            Case Is = 2
                Try
                    Me.BindingContext(dsCatClientes, "CAT_CLIENTES").Position += 1
                    CargarImagen(txtID_CLIENTE.Text)
                Catch ex As Exception
                    MsgBox(EX.Source & "; " & EX.Message)
                End Try
            Case Is = 3
                Try
                    Me.BindingContext(dsCatClientes, "CAT_CLIENTES").Position = _
                    Me.BindingContext(dsCatClientes, "CAT_CLIENTES").Count - 1
                    CargarImagen(txtID_CLIENTE.Text)
                Catch ex As Exception
                    MsgBox(EX.Source & "; " & EX.Message)
                End Try
            Case Is = 6
                Nuevo()
            Case Is = 7
                'Modificar
                HabilitaBotones(False)
                HabilitaCaptura(True)
            Case Is = 8
                Eliminar()
            Case Is = 9
                'Buscar registro
                Me.BindingContext(dsCatClientes, "CAT_CLIENTES").Position = _
                BuscarRegistro(Me.BindingContext(dsCatClientes, "CAT_CLIENTES").Position)
                CargarImagen(txtID_CLIENTE.Text)
            Case Is = 10
                Actualizar()
                CargarImagen(txtID_CLIENTE.Text)
            Case Is = 11
                'Imprimir()
            Case Is = 12
                Grabar()
                CargarImagen(txtID_CLIENTE.Text)
            Case Is = 13
                Cancelar()
                CargarImagen(txtID_CLIENTE.Text)
            Case Is = 14
                'Salir(cerrar el formulario)
                Me.Close()
        End Select
    End Sub
    Private Function BuscarRegistro(ByVal prmPos As Integer) As Integer
        'Código para buscar un registro
        'Recibe como parametro la posición actual en el DataSet
        'para, en el caso de no encontrar el registro solicitado,
        'regresar la posición del registro antes de iniciar.
        'Lo que hace este procedimiento es
        'regresar la posición en la que se encuentra el registro
        'solicitado, en caso d eno encontrarlo, regresa la posición
        'antes de iniciar la búsqueda
        Try
            Dim dvCatClientes As DataView = _
                    New DataView(dsCatClientes.Tables(0), "", _
                    "ID_CLIENTE", DataViewRowState.CurrentRows)
            'Declaramos varID_CLIENTE
            Dim varID_CLIENTE As String = ""
            'Preguntamos la clave del cliente que se desea buscar
            varID_CLIENTE = InputBox("Introduce la clave a buscar", "Buscar")
            If Not varID_CLIENTE = "" Then
                'Regresamos el index del cliente encontrado
                Return dvCatClientes.Find(varID_CLIENTE)
                Exit Function
            Else
                'Si no se especificó el cliente, regresamos la
                'posición (index) del cliente original(prmPos)
                MessageBox.Show("La búsqueda no se puede realizar", _
                "Información del sistema", MessageBoxButtons.OK, _
                MessageBoxIcon.Information)
                Return prmPos
                Exit Function
            End If
        Catch ex As Exception
            'En caso de error, suponiendo que no se encontró el cliente,
            'regresamos la posición original del cliente(prmPos)
            MessageBox.Show(ex.Message, "Error", _
            MessageBoxButtons.OK, MessageBoxIcon.Error)
            Return prmPos
            Exit Function
        End Try
    End Function

    Private Sub Grabar()
        Try
            'Indicamos que termine la edición actual
            Me.BindingContext(dsCatClientes, _
            "CAT_CLIENTES").EndCurrentEdit()
            'Actializamos la Base de datos
            daCatClientes.Update(dsCatClientes, "CAT_CLIENTES")
            HabilitaBotones(True)
            HabilitaCaptura(False)
        Catch ex As Exception
            MsgBox(ex.Source & "; " & ex.Message, _
            MsgBoxStyle.OKOnly, "Ocurrió un error")
        End Try
    End Sub
    Private Function GrabarImagen(ByVal prmID_CLIENTE As String) As Boolean
        'Función para Cargar imagen a la base de datos
        Dim SaveImage As Boolean = False
        Dim curFileName As String = ""
        Try
            'buscamos la imagen a grabar
            Dim openDlg As OpenFileDialog = New OpenFileDialog()
            openDlg.Filter = "All Bitmap files|*.bmp"
            Dim filter As String = openDlg.Filter
            openDlg.Title = "Open a Bitmap File"
            If (openDlg.ShowDialog() = DialogResult.OK) Then
                curFileName = openDlg.FileName
                SaveImage = True
            Else
                Return False
                Exit Function
            End If
            If SaveImage = True Then
                'CARGAR FOTOGRAFIA
                Dim fsFoto As FileStream
                fsFoto = New FileStream(curFileName, FileMode.Open)
                Dim fiFoto As FileInfo = New FileInfo(curFileName)
                Dim Temp As Long = fiFoto.Length
                Dim lung As Long = Convert.ToInt32(Temp)
                Dim picture(lung) As Byte
                fsFoto.Read(picture, 0, lung)
                fsFoto.Close()
                Dim cmdFoto As New OleDbCommand("CARGA_FOTO", cnnCatClientes)
                cmdFoto.CommandType = CommandType.StoredProcedure
                Dim sql_ID_Cliente = New OleDbParameter("@ID_CLIENTE", prmID_CLIENTE)
                Dim sql_FOTO As New OleDbParameter("@IMAGEN", SqlDbType.Image)
                sql_FOTO.Value = picture
                cmdFoto.Parameters.Add(sql_ID_Cliente)
                cmdFoto.Parameters.Add(sql_FOTO)
                cmdFoto.ExecuteNonQuery()
                cmdFoto.Dispose()
                sql_FOTO = Nothing
                picture = Nothing
                Return True
                Exit Function
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
            Return False
        End Try
    End Function
    Private Sub CargarImagen(ByVal prmID_CLIENTE As String)
        Try
            ''Cargar(Fotografia)
            Dim cmdFoto As New OleDbCommand _
            ("select FOTO from CAT_CLIENTES where id_cliente = '" & prmID_CLIENTE & "'")
            cmdFoto.Connection = cnnCatClientes
            cmdFoto.CommandType = CommandType.Text
            Dim daFoto As New OleDbDataAdapter(cmdFoto)
            Dim dsFoto As New DataSet()
            daFoto.Fill(dsFoto)
            Dim bits As Byte() = CType(dsFoto.Tables(0).Rows(0).Item(0), Byte())
            Dim memorybits As New MemoryStream(bits)
            Dim bitmap As New Bitmap(memorybits)
            picFoto.Image = bitmap
            cmdFoto.Dispose()
            dsFoto.Dispose()
            cmdFoto.Dispose()
        Catch EX As Exception
            MessageBox.Show(EX.Message, "No se puede mostrar fotografia", MessageBoxButtons.OK, MessageBoxIcon.Information)
            picFoto.Image = Nothing
            picFoto.Refresh()
        End Try
    End Sub

    Private Sub btnCargarImagen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCargarImagen.Click
        If GrabarImagen(txtID_CLIENTE.Text) Then
            MessageBox.Show("Imagen almacenada", "Grabar Imagen", MessageBoxButtons.OK, MessageBoxIcon.Information)
            CargarImagen(txtID_CLIENTE.Text)
        End If
    End Sub

Del código que vemos aqui los realmente importantes son los procedimientos GrabarImagen() y CargarImagen. Son éstos los que hacen lo realmente interesante. El resto de código lo puse tomando en cuenta que de alguna menera debemos llenar la tabla con datos.

La apariencia final de esta aplicación (viene el el archivo adjunto) va como se muestra:

Bueno esto es todo por hoy,... espero que lo que has leido aqui te sirva de algo.

Hasta la proxima

 


Espacios de nombres usados en el código de este artículo:

System.Data
System.Data.OleDb

System.IO
System.Text


Fichero con el código de ejemplo: TheKin_proImages.zip - Tamaño 15 KB


ir al índice