Principales respuestas
cargar imagen en un PictureBox

Pregunta
-
Buenas a todos/as
Programo en vb.net y uso MySQL
Con este método actualizo, todo funciona bien hasta ahí.
Using conexionx As New MySqlConnection(cadenaConexion) conexionx.Open() 'Dim actualizar As String = "UPDATE tbla_compania SET Nombre =@Nombre, Siglas =@Siglas, Eslogan =@Eslogan, Direccion =@Direccion, RNC =@RNC, Telefonos =@Telefonos, Sucursal =@Sucursal, Logo_Empresa =@Logo_Empresa WHERE CodigoConfigurarMiCompania =@CodigoConfigurarMiCompania" Dim actualizar As String = "UPDATE tbla_compania SET Nombre =@Nombre, Siglas =@Siglas, Eslogan =@Eslogan, Direccion =@Direccion, RNC =@RNC, Telefonos =@Telefonos, Sucursal =@Sucursal, Logo_Empresa =@Logo_Empresa WHERE CodigoConfigurarMiCompania =@CodigoConfigurarMiCompania" Using comando As New MySqlCommand(actualizar, conexionx) comando.Parameters.AddWithValue("@Nombre", TextNombre.Text.Trim()) comando.Parameters.AddWithValue("@Siglas", TextSiglas.Text.Trim()) comando.Parameters.AddWithValue("@Eslogan", TextEslogan.Text.Trim()) comando.Parameters.AddWithValue("@Direccion", TextDireccion.Text.Trim()) comando.Parameters.AddWithValue("@RNC", TextRNC.Text.Trim()) comando.Parameters.AddWithValue("@Telefonos", TextTelefonos.Text.Trim()) comando.Parameters.AddWithValue("@Sucursal", txtsucursal.Text.Trim()) ''Valor de Foto If PictureBoxLogo_Empresa.Image Is Nothing Then comando.Parameters.Add("@Logo_Empresa", MySqlDbType.Binary).Value = DBNull.Value Else Dim arrImage() As Byte, myMs As New IO.MemoryStream PictureBoxLogo_Empresa.Image.Save(myMs, PictureBoxLogo_Empresa.Image.RawFormat) arrImage = myMs.GetBuffer() comando.Parameters.Add("@Logo_Empresa", MySqlDbType.Binary).Value = arrImage End If comando.Parameters.AddWithValue("@CodigoConfigurarMiCompania", Convert.ToInt64(txtCodigoComp.Text.Trim())) comando.ExecuteNonQuery() End Using End Using MsgBox("Para que los cambios surtan efecto, deberá cerrar y abrir el programa.", vbInformation, "Correcto")
Con este método cargo los controles (aqui vienen los problemas)
Public Sub CargarDatosControles() Using Conexion As New MySqlConnection(cadenaConexion) Conexion.Open() Dim consultaSQL As String = "Select Nombre, Siglas, Eslogan, Direccion, RNC, Telefonos, Sucursal, Logo_Empresa from tbla_compania WHERE CodigoConfigurarMiCompania =@CodigoConfigurarMiCompania" Dim comando As New MySqlCommand(consultaSQL, Conexion) comando.Parameters.AddWithValue("@CodigoConfigurarMiCompania", txtCodigoComp.Text) 'LD=LectorDatos Dim LD As MySqlDataReader LD = comando.ExecuteReader() If LD.Read() Then 'Establecemos valores de la asignación, en el mismo orden de los valores de la consulta TextNombre.Text = LD.GetString(LD.GetOrdinal("Nombre")) TextSiglas.Text = LD.GetString(LD.GetOrdinal("Siglas")) TextEslogan.Text = LD.GetString(LD.GetOrdinal("Eslogan")) TextDireccion.Text = LD.GetString(LD.GetOrdinal("Direccion")) TextRNC.Text = LD.GetString(LD.GetOrdinal("RNC")) TextTelefonos.Text = LD.GetString(LD.GetOrdinal("Telefonos")) txtsucursal.Text = LD.GetString(LD.GetOrdinal("Sucursal")) Dim data = LD.GetSByte(LD.GetOrdinal("Logo_Empresa")) Dim stream = New MemoryStream(data) PictureBoxLogo_Empresa.Image = Image.FromStream(stream) End If End Using End Sub
todos los controles cargan bien, menos, el de cargar la imagen al
PictureBox
muestra el siguiente error:
Respuestas
-
Otra solucion es que esa clase contiene item que te retorna el valoer segun el nombre de columna y indice
por lo que este ejemplo te deberia funcional sin problemas
Dim data() as byte = LD.Item(LD.GetOrdinal("Logo_Empresa")) Dim stream = New MemoryStream(data) PictureBoxLogo_Empresa.Image = Image.FromStream(stream)
- Marcado como respuesta EliannyRD sábado, 3 de noviembre de 2018 21:32
Todas las respuestas
-
De que tipo es el campo en la base de datos, porque lo mas sencillo es hacerlo con dos funciones una que convierta las image a string y otra de string a image, que a mi me funciona guardarlas en base de datos en formato string
en c# sera algo asi
public static string ImagenTo_S(Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
string base64String = Convert.ToBase64String(ms.ToArray());
return base64String;
}
public static System.Drawing.Image S_ToImage(string StringBase)
{
System.Drawing.Image img = null;
if (!string.IsNullOrEmpty(StringBase))
{
byte[] Pd = Convert.FromBase64String(StringBase);
MemoryStream memstr = new MemoryStream(Pd);
img = System.Drawing.Image.FromStream(memstr);
}
return img;
} -
Hola:
Prueba con este códigolP_MostrarLogo(txtCodigoComp.Text)
Private Sub lP_MostrarLogo(ByVal vsCodigoConfigurarMiCompania As String)
Try
Dim loResultado As Object
' crear sentencia, conexión y comando para obtener la imagen de la base de datos
Dim lsQuery As String = "SELECT Logo_Empresa FROM tbla_compania WHERE CodigoConfigurarMiCompania=@Codigo"
Using loConexion As New MySqlConnection(cadenaConexion)
loConexion.Open()
' crear comando
Using loComando As New MySqlCommand(lsQuery, loConexion)
loComando.Parameters.Add(New MySqlParameter("@Codigo", vsCodigoConfigurarMiCompania))
loResultado = loComando.ExecuteScalar()
If IsDBNull(loResultado) = True Then
Me.PictureBoxLogo_Empresa.Image = Nothing
Else
Dim aBytImagen As Byte() = CType(loResultado, Byte())
Me.PictureBoxLogo_Empresa.Image = Image.FromStream(lF_ByteArrayToStream(aBytImagen))
End If
End Using
End Using
Catch ex As Exception
MessageBox.Show(ex.Message, "lP_MostrarLogo", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Try
End SubPrivate Function lF_ByteArrayToStream(ByVal Array As Byte()) As Stream
' crear un objeto stream en memoria conteniendo los datos del array de bytes
Dim oMemoryStream As MemoryStream = New MemoryStream(Array)
Return oMemoryStream
End FunctionUn saludo desde Bilbo
Carlos
- Editado J. Carlos Herrero sábado, 3 de noviembre de 2018 8:17
-
gracias a todos por contestar
el tipo de dato del campo: Logo_Empresa es: blob
estoy probando el código de: Editado J. Carlos Herrero, pero tiene un error en la primera linea de codigo: lP_MostrarLogo(txtCodigoComp.Text), dise que se esperaba declararlo.
ademas y como llamo el procedimiento
me podrían explicar una forma mas sencilla, es posible
- Editado EliannyRD sábado, 3 de noviembre de 2018 13:00
-
-
-
Que raro porque a si es como yo obtengo la imagen de la base de datos pero bueno si eso no te funciona escribe esto
Dim data = LD.GetSqlBinary(LD.GetOrdinal("Logo_Empresa")) Dim stream = New MemoryStream(data.Value) PictureBoxLogo_Empresa.Image = Image.FromStream(stream)
-
gracias por dar seguimiento a mi caso
dice GetSqlBinary, no es miembro de MySqldata
quizás es porque yo uso como base de datos mysql y quizás tu usas sql serever
ESTE es listado de los get que me salen.
- Editado EliannyRD sábado, 3 de noviembre de 2018 16:17
-
algo anda mal porque la clase MySqldataReader si tiene esas funciones
MySqldataReader.GetStream(int ordinal) si es un miembro de esa clase mira a ver si lo pusiste mal
entra en este link y mira los mienbros de la clase y veras que si esta hay
-
Otra solucion es que esa clase contiene item que te retorna el valoer segun el nombre de columna y indice
por lo que este ejemplo te deberia funcional sin problemas
Dim data() as byte = LD.Item(LD.GetOrdinal("Logo_Empresa")) Dim stream = New MemoryStream(data) PictureBoxLogo_Empresa.Image = Image.FromStream(stream)
- Marcado como respuesta EliannyRD sábado, 3 de noviembre de 2018 21:32
-
Resuelto 100x%
Gracias, por todo, gracias.............................
solo tengo otra pregunta si es posible:
supongamos que el campo Logo Empresa esta vacío, es decir que no tiene ninguna imagen almacenada, al momento de cargar da este error.
- Editado EliannyRD sábado, 3 de noviembre de 2018 17:59
-
-
ya verifique, el campo acepta valores nulos
supongamos que el campo Logo Empresa esta vacío, es decir que no tiene ninguna imagen almacenada, al momento de cargar da error porque no puede cargar el campo Logo Empresa si esta vacío.
ahora bien si tiene la imagen almacenada, si carga bien,
-
ok no debería ser a si pero otra solucion seria me imagino que extraes la imagen atraves de un boton
usando el openfiledialog y la ruta se la pasas a una variable lo que tienes que hacer es crear una condicion
por ejemplo si la variable imagen es nothing osea nulo creas una imagen de este modo
''Valor de Foto If PictureBoxLogo_Empresa.Image Is Nothing Then
Dim imagen As New Bitmap(50, 50) comando.Parameters.Add("@Logo_Empresa", MySqlDbType.Binary).Value = imagen Else Dim arrImage() As Byte, myMs As New IO.MemoryStream PictureBoxLogo_Empresa.Image.Save(myMs, PictureBoxLogo_Empresa.Image.RawFormat) arrImage = myMs.GetBuffer() comando.Parameters.Add("@Logo_Empresa", MySqlDbType.Binary).Value = arrImage End If
aunque no muestre una imagen pero no te la va a reconocer como nulo
y se la pasas al campo espero me comprendas
- Editado DANTE-3D sábado, 3 de noviembre de 2018 18:50
-
-
-
Hola:
En un Form con 1 DataGridView, 1 label y 1 PictureBox, copia y pega el siguiente códigoOption Strict On
Option Explicit On
Imports System.Data.SqlClient
Imports System.IOPublic Class Form1
Private moDataTable As New DataTable
Private msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=TU_BASE_DE_DATOS;Integrated Security=True"Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
Me.PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
Try
Dim lsQuery As String = "SELECT id_usuario FROM usuario ORDER BY id_usuario"Using loConexion As New SqlConnection(msCadenaSQL)
Using loDataAdapter As New SqlDataAdapter(lsQuery, loConexion)
loDataAdapter.Fill(moDataTable)
End Using
End Using
Me.DataGridView1.DataSource = moDataTable
Catch ex As Exception
MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Try
End SubPrivate Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
If e.RowIndex = -1 Then
Return
End If
Dim loFila As DataGridViewRow = Me.DataGridView1.CurrentRow()
Me.Label1.Text = loFila.Cells("id_usuario").Value.ToString()
lP_MostrarFoto(loFila.Cells("id_usuario").Value.ToString())
End SubPrivate Sub lP_MostrarFoto(ByVal vsid As String)
Try
Dim loResultado As Object
' crear sentencia, conexión y comando para obtener la imagen de la base de datos
Dim lsQuery As String = "SELECT foto FROM usuario WHERE id_usuario=@id"
Using loConexion As New SqlConnection(msCadenaSQL)
loConexion.Open()
' crear comando
Using loComando As New SqlCommand(lsQuery, loConexion)
loComando.Parameters.Add(New SqlParameter("@id", vsid))
loResultado = loComando.ExecuteScalar()
If IsDBNull(loResultado) = True Then
Me.PictureBox1.Image = Nothing
Else
Dim aBytImagen As Byte() = CType(loResultado, Byte())
Me.PictureBox1.Image = Image.FromStream(lF_ByteArrayToStream(aBytImagen))
End If
End Using
End Using
Catch ex As Exception
MessageBox.Show(ex.Message, "lP_MostrarFoto", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Try
End SubPrivate Function lF_ByteArrayToStream(ByVal Array As Byte()) As Stream
' crear un objeto stream en memoria conteniendo los datos del array de bytes
Dim oMemoryStream As MemoryStream = New MemoryStream(Array)
Return oMemoryStream
End Function
End ClassEl resultado es.
P.D.
El campo foto es varbinary(max)Un saludo desde Bilbo
Carlos -
Jejejej que lio lo raro es que ami me funciona
Valor de Foto If PictureBoxLogo_Empresa.Image Is Nothing Then
Dim imagen As New Bitmap(50, 50)
PictureBoxLogo_Empresa.Image = imagen Dim arrImage() As Byte, myMs As New IO.MemoryStream PictureBoxLogo_Empresa.Image.Save(myMs, PictureBoxLogo_Empresa.Image.RawFormat) arrImage = myMs.GetBuffer() comando.Parameters.Add("@Logo_Empresa", MySqlDbType.Binary).Value = arrImage Else Dim arrImage() As Byte, myMs As New IO.MemoryStream PictureBoxLogo_Empresa.Image.Save(myMs, PictureBoxLogo_Empresa.Image.RawFormat) arrImage = myMs.GetBuffer() comando.Parameters.Add("@Logo_Empresa", MySqlDbType.Binary).Value = arrImage End If
-
Gracias a todos por sus respuestas
resuelto todo, 100x%
el código me quedo así:
Using conexionx As New MySqlConnection(cadenaConexion) conexionx.Open() Dim actualizar As String = "UPDATE tbla_compania SET Nombre =@Nombre, Siglas =@Siglas, Eslogan =@Eslogan, Direccion =@Direccion, RNC =@RNC, Telefonos =@Telefonos, Sucursal =@Sucursal, Logo_Empresa =@Logo_Empresa WHERE CodigoConfigurarMiCompania =@CodigoConfigurarMiCompania" Using comando As New MySqlCommand(actualizar, conexionx) comando.Parameters.AddWithValue("@Nombre", TextNombre.Text.Trim()) comando.Parameters.AddWithValue("@Siglas", TextSiglas.Text.Trim()) comando.Parameters.AddWithValue("@Eslogan", TextEslogan.Text.Trim()) comando.Parameters.AddWithValue("@Direccion", TextDireccion.Text.Trim()) comando.Parameters.AddWithValue("@RNC", TextRNC.Text.Trim()) comando.Parameters.AddWithValue("@Telefonos", TextTelefonos.Text.Trim()) comando.Parameters.AddWithValue("@Sucursal", txtsucursal.Text.Trim()) ''Valor de Foto If PictureBoxLogo_Empresa.Image Is Nothing Then comando.Parameters.Add("@Logo_Empresa", MySqlDbType.Binary).Value = DBNull.Value Else Dim arrImage() As Byte, myMs As New IO.MemoryStream PictureBoxLogo_Empresa.Image.Save(myMs, PictureBoxLogo_Empresa.Image.RawFormat) arrImage = myMs.GetBuffer() comando.Parameters.Add("@Logo_Empresa", MySqlDbType.Binary).Value = arrImage End If comando.Parameters.AddWithValue("@CodigoConfigurarMiCompania", Convert.ToInt64(txtCodigoComp.Text.Trim())) comando.ExecuteNonQuery() End Using End Using
Public Sub CargarDatosControles() Using Conexion As New MySqlConnection(cadenaConexion) Conexion.Open() Dim consultaSQL As String = "Select Nombre, Siglas, Eslogan, Direccion, RNC, Telefonos, Sucursal, Logo_Empresa from tbla_compania WHERE CodigoConfigurarMiCompania =@CodigoConfigurarMiCompania" Dim comando As New MySqlCommand(consultaSQL, Conexion) comando.Parameters.AddWithValue("@CodigoConfigurarMiCompania", txtCodigoComp.Text) 'LD=LectorDatos Dim LD As MySqlDataReader LD = comando.ExecuteReader() If LD.Read() Then 'Establecemos valores de la asignación, en el mismo orden de los valores de la consulta TextNombre.Text = LD.GetString(LD.GetOrdinal("Nombre")) TextSiglas.Text = LD.GetString(LD.GetOrdinal("Siglas")) TextEslogan.Text = LD.GetString(LD.GetOrdinal("Eslogan")) TextDireccion.Text = LD.GetString(LD.GetOrdinal("Direccion")) TextRNC.Text = LD.GetString(LD.GetOrdinal("RNC")) TextTelefonos.Text = LD.GetString(LD.GetOrdinal("Telefonos")) txtsucursal.Text = LD.GetString(LD.GetOrdinal("Sucursal")) If LD.IsDBNull(LD.GetOrdinal("Logo_Empresa")) Then ' SI la información encontrada es nula, no cargar imagen. Else ' De lo contrario, si cargar imagen Dim data() As Byte = LD.Item(LD.GetOrdinal("Logo_Empresa")) Dim stream = New MemoryStream(data) PictureBoxLogo_Empresa.Image = Image.FromStream(stream) End If End If End Using End Sub