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
No hay comentarios:
Publicar un comentario