Imágenes en SQL Server Fecha: 06/Mar/2005 (5 de Marzo 2005)
|
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 SubDel 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