sábado, 24 de noviembre de 2007

Guardar Foto en una Base de Datos SQL SERVER 2000 o 2005 , utilizando .NET 2005 - PARTE 1

Hola en esta oportunidad presentare un articulo que permitira a los desarrolladores guargar y cargar una imagen utilizando Visual Studio 2005 con el Lenguaje .net y una Base de datos SQL SERVER en las Versiones 2000 y 2005
Para guardar una foto se puede hacer de 3 Formas
1º Es guardando la Foto en la Misma Base de Datos que esta ( Solo para imagenes de Formato BMP )

Este es el Formularios en que se va a trabajar . En el formulario hay una varible que se llama "curFileName " de un tipo String que va debajo del "PUBLIC CLASS" del Formulario. Que se pone asi Public curFileName As String = "" . Y luego en la parte Genera importamos unas clases que nos permitira utilzar el codigo que son

Imports System.IO
Imports System.Text

-Hay un boton que dice Cargar en ese Boton va el Siguiente Codigo

Dim openDlg As OpenFileDialog = New OpenFileDialog()
openDlg.Filter = "Todos los Archivos bmp *.bmp"
Dim filter As String = openDlg.Filter
openDlg.Title = "Abrir los Archivos Bmp"
If (openDlg.ShowDialog() = Windows.Forms.DialogResult.OK) Then
picFoto.ImageLocation = openDlg.FileName
curFileName = openDlg.FileName
Else
Exit Sub
End If

-luego en el Boton Grabar Ingresamos el codigo para que pueda guardar los datos y la foto a la Base de Datos SQL SERVER

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 comando As New SqlClient.SqlCommand
Dim parametro As New SqlClient.SqlParameter
comando.Connection = MDISistema.cnn
comando.CommandType = CommandType.StoredProcedure
comando.CommandText = "guardarpersonal"
parametro = comando.Parameters.Add("@Codigo", SqlDbType.Char, 10)
parametro.Value = Me.txtcodigo.Text.Trim
parametro = comando.Parameters.Add("@Apellido", SqlDbType.VarChar, 50)
parametro.Value = Me.txtapellido.Text.Trim
parametro = comando.Parameters.Add("@Nombre", SqlDbType.VarChar, 50)
parametro.Value = Me.txtnombre.Text.Trim
parametro = comando.Parameters.Add("@Direccion", SqlDbType.VarChar, 50)
parametro.Value = Me.txtdireccion.Text.Trim
parametro = comando.Parameters.Add("@Telefono", SqlDbType.Char, 10)
parametro.Value = Me.txttelefono.Text.Trim
parametro = comando.Parameters.Add("@Foto", SqlDbType.Image)
parametro.Value = picture
parametro = comando.Parameters.Add("@Codtipo", SqlDbType.Char, 10)
parametro.Value = Me.cbotipo.SelectedValue
comando.ExecuteNonQuery()

bueno en las primeras lineas de codigo son las que permiten que la foto se conbierta en Byte para luego en Byte Guardar la Imagen en la Base de Datos y el resultado de la conversion lo guarda el la varible que se llama " picture " que le mando a la Base de Datos àra que Guarde

Bueno en el siguiente codigo nos permite buscar la imagen en la Base de Datos SQL SERVER y luego mostrarlo en el control PictureBox y es el Siguiente


Public Sub CargarImagen(ByVal codigo As String)
Try
''Cargar(Fotografia)
Dim daFoto As New SqlClient.SqlDataAdapter("exec buscarfoto '" & codigo & "'", MDISistema.cnn)
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
dsFoto.Dispose()
daFoto.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

En el SqlClient.SqlDataAdapter pongo mi Store Procedure y el parametro lo mando en el codigo y listo me carga la foto en el PictureBox la Foto guardada en la Base de Datos :D

Saludos........ Victor Altamirano V.

16 comentarios:

Micke dijo...

Ta bacan tu tutorial men y haber si publicas uno en c# y porfa ya te avisare de algunos detalles q se podrian usar grax

María Cristina Espinosa López dijo...

Hola!!!
Que buen material, pero tengo un problemilla no entiendo a que te refieres a MDIsistema, es acaso el formulario que conectas.
Cuando en mi proyecto mi conexcion se llama cnnstr, le doy comando.connection = cnnstr y no me acepta, sabes Como lo puedo lograr?
ahora, tu me podrias colaborar con la programacion de los botones, actualizar , guardar, nuevo, de este ejemplo..
Gracias..
mi correo cristinita_ucn@hotmail.com
Feliz dia..
cristi

María Cristina Espinosa López dijo...

Hola victor, de nuevo Yo..
Mira en si, es que tengo una base de datos en sql de una tienda.
quisiera que cada cliente tuviera su foto, y que me pudiera desplazar por cada uno de los registros y poder visualizar su foto.
intenté con este codigoy bien puedo mirar las fotos en modo de ejecución.. pero imaginate que cuando cierro el formulario y lo vuelvo a abrir no me aparecen las fotos de los clientes..
tal vez no me estan guardando las fotos..
no se que pasará?
esa ultima parte que colocas de cargar, supongo que se refiere al boton buscar, donde debo colocar este codigo? una clase aparte, ?
Por fa me podrias explicar, es que apenas estoy iniciando en .net y quisiera aprender muchisimo..
Gracias..
Gracias
cristi

Anónimo dijo...

Ese codigo tiene un problema y es que si no quiero guardarle foto al registro te da un error

Victor Altamirano Vasquez dijo...

Hola Anonimo
en este post solo considere el "GUARDAR LA IMAGEN" pero si no se desea guardar la imagen claro que se aria otras cosas para que no me salga error al no guardar la imagen

Saludos
Victor Altamirano V.

Lord Belial dijo...

Entonces la página no está completa si marca errores (-_-)

Alex dijo...

He escuchado sobre un programa. El ha sido en un sitio con los softwares - reparar base sql 2000. El programa ha terminado mis problemas muy con facilidad y de balde. Todavia sobre este programa mis amigos han estado contento de este utilidad. Ellos han dicho que con ayuda del instrumento ha economizado el tiempo. El utilidad ha demostrado sus posibilidades en guardar los datos de salidas como un solo archivo .pst o como un grupo de archivos .eml, .vcf y .txt.

Anónimo dijo...

hola muy buen aporte, pero necesito hacerlo en visual studio 2008, agradeceria su ayuda.

Victor Altamirano Vasquez dijo...

hola Anónimo es lo mismo solo tienes que pasar el codigo a VS 2008 :D

Saludos

Victor Altamirano

Virussoul dijo...

buen post si en algo em ayudo esta buenazo

Pero sabes tengo un problema tengo un dato en sql varbinary ingredaso por lector de huella digital y me gustaria mostrarlo en mi presentacion como hago eso si esta en varbinary a imagen qe no es lo mismo de byte a imagen

Anónimo dijo...

ocupo ayuda... a mi me da bronca en esta poricon de codigo:
Dim bits As Byte() = datos.consultar imagen 'funcion que me retorna los bytes almacenados en la base correspondientes a la imagen
Dim memorybits As New MemoryStream(bits)
Dim bitmap As New Bitmap(memorybits)
picFoto.Image = bitmap


la bronca me la da cuando asigno los memorybits al bitmap

javier rodriguez dijo...

esta muy bueno este tutorial y gracias.....

Victor Flamenco dijo...

Estoy usando VB.NET2008 y comprendo el código y casi me funciona perfectamente pero me da error en la parte de "comando.Connection = MDISistema.cnn"

entiendo que estas usando un formulario MDI y que en ese has declarado la conexión, pero yo NO estoy usando una conexión manual, si no que una automática (tblEmpleadosBindingSource, y toda esa bola de cosas).... que debo escribir en lugar de esa linea que me da error para corregir??

Anónimo dijo...

Buena esa... yo intenté hace unos años hacerlo así, pero desistí cuando me di cuenta que eso baja mucho el rendimiento de la aplicación más si será un sistema p.e de nóminas.. la mejor práctica es que tu sistema lleve un archivo de fotos donde en la Base de datos solo se guarde la dirección de las fotos y luego se ocupe de recuperarlas de la carpeta donde las manejes. No es recomendable esta practica de guardar las imágenes en la propia base de datos aunque está muy interesante e ingenioso.

Edward Rojas dijo...

ta legal me sirvió de mucha ayuda, aunque esta incompleto, pero no importa, seria mucho pedir yaa

Unknown dijo...

ey men k buen tutorial me ayudo en 80% solo k no entiendo la parte de la consulta de la foto ,todos esos codigos k pones lo estoy adecuando en mi sistema y se me hace dificil nose si sabras el mismo procedimiento utlizando capas.Si sabes porfavor avisa para k me enseñes.

PD: Buen aporte