Jump to content

Consulta Vb.Net 2010 & SQL Server 2008


Recommended Posts

Resulta que estoy tratando de cargar imagines, desde una base de datos a un formulario en tiempo de ejecución, tengo 2 picturebox y necesito cargar imágenes almacenadas en la BD por su ID, solo puedo cargar 1 sola imagen y el segundo picturebox vació, Intente otras cosas pero me cargo la misma imagen en los 2 picturebox.

 

 

Espero que se entienda la idea.

 

 

BD

 

ID Image Nombre

1 imagen.jpg rojo

2 imagen2.jpg verde

 

 

Es poder cargar en picturebox1 = la imagen roja

y en el picturebox2 = la imagen verde

 

Ambas simultáneamente.

 

 

Desde ya estoy agradecido, saludos.

Link to comment
Share on other sites

Podrías partir mostrando el código donde carga las imágenes...es posible que estés poniendo el mismo dato o que por error hayas subido la misma foto 2 veces a tu BD.

 

Postea el código.

 

 

Saludos :krider:

Link to comment
Share on other sites

Adjunto código.

Option Strict On
Imports Microsoft.VisualBasic
Imports System.Data
Imports System.IO
Imports System.Drawing
Public Class TablaNavegar
Private laTabla As DataTable
Private laFila As Integer
Private ReadOnly Property totalFilas() As Integer
	Get
		Return laTabla.Rows.Count - 1
	End Get
End Property
''' <summary>
''' El constructor que recibe la tabla a usar
''' </summary>
''' <param name="tabla">
''' La tabla por la que se navegará
''' </param>
''' <remarks>
''' 20/Feb/2007
''' </remarks>
Public Sub New(ByVal tabla As DataTable)
	laTabla = tabla
	laFila = 0
	'totalFilas = tabla.Rows.Count - 1
End Sub
Public Sub ActualizarTabla(ByVal tabla As DataTable)
	laTabla = tabla
	'totalFilas = tabla.Rows.Count - 1
	If laFila > totalFilas Then
		laFila = totalFilas
	End If
	If laFila < 0 Then
		laFila = 0
	End If
End Sub
' Los cuatro métodos para navegar por las filas
Public Function Primera() As DataRow
	laFila = 0
	Return laTabla.Rows(laFila)
End Function
Public Function Ultima() As DataRow
	laFila = totalFilas
	Return laTabla.Rows(laFila)
End Function
Public Function Siguiente() As DataRow
	laFila += 1
	If laFila > totalFilas Then
		laFila = totalFilas
	End If
	Return laTabla.Rows(laFila)
End Function
Public Function Anterior() As DataRow
	laFila -= 1
	If laFila < 0 Then
		laFila = 0
	End If
	Return laTabla.Rows(laFila)
End Function
''' <summary>
''' Devuelve un DataRow con la fila actual.
''' </summary>
''' <value>
''' Devuelve un DataRow con la fila actual
''' </value>
''' <returns>
''' Un objeto DataRow con la fila actual.
''' </returns>
''' <remarks></remarks>
Public ReadOnly Property FilaActual() As DataRow
	Get
		If Me.totalFilas >= 0 Then
			Return laTabla.Rows(laFila)
		Else
			Return Nothing
		End If
	End Get
End Property
''' <summary>
''' Propiedad de solo lectura que devuelve
''' el índidce de la fila actual.
''' </summary>
''' <value>
''' El índice de la fila actual
''' </value>
''' <returns>
''' El valor del índice de la fila actual.
''' </returns>
''' <remarks>
''' 20/Feb/2007
''' </remarks>
Public ReadOnly Property NumeroFilaActual() As Integer
	Get
		Return laFila
	End Get
End Property
''' <summary>
''' Propiedad de solo lectura que devuelve
''' el índice de la última fila.
''' </summary>
''' <value>
''' El índice de la última fila
''' </value>
''' <returns>
''' El valor del índice de la última fila.
''' </returns>
''' <remarks>
''' 20/Feb/2007
''' </remarks>
Public ReadOnly Property NumeroUltimaFila() As Integer
	Get
		Return totalFilas
	End Get
End Property
''' <summary>
''' Indizador que devuelve la fila indicada
''' </summary>
''' <param name="index">
''' El índice de la fila a devolver.
''' El índice indicado no altera el valor del número de la fila actual.
''' </param>
''' <value>
''' La fila con el índice indicado.
''' </value>
''' <returns>
''' Un objeto DataRow con la fila indicada.
''' </returns>
''' <remarks>
''' 20/Feb/2007
''' </remarks>
Default Public ReadOnly Property Item(ByVal index As Integer) As DataRow
	Get
		If index < 0 Then
			index = 0
		End If
		If index > totalFilas Then
			index = totalFilas
		End If
		Return laTabla.Rows(index)
	End Get
End Property
' Métodos compartidos
Public Shared Function Image2Bytes(ByVal img As Image) As Byte()
	Dim sTemp As String = Path.GetTempFileName()
	Dim fs As New FileStream(sTemp, FileMode.OpenOrCreate, FileAccess.ReadWrite)
	img.Save(fs, System.Drawing.Imaging.ImageFormat.Png)
	' Cerrarlo y volverlo a abrir
	' o posicionarlo en el primer byte
	'fs.Close()
	'fs = New FileStream(sTemp, FileMode.Open, FileAccess.Read)
	fs.Position = 0
	'
	Dim imgLength As Integer = CInt(fs.Length)
	Dim bytes(0 To imgLength - 1) As Byte
	fs.Read(bytes, 0, imgLength)
	fs.Close()
	Return bytes
End Function
Public Shared Function Bytes2Image(ByVal bytes() As Byte) As Image
	If bytes Is Nothing Then Return Nothing
	'
	Dim ms As New MemoryStream(bytes)
	Dim bm As Bitmap = Nothing
	Try
		bm = New Bitmap(ms)
	Catch ex As Exception
		System.Diagnostics.Debug.WriteLine(ex.Message)
	End Try
	Return bm
End Function
End Class

 

Form1

Imports System.Data
Imports System.Data.SqlClient
Public Class Form1
   'Private cnnStr As String = "Data Source=.\SQLEXPRESS; Initial Catalog=conImagenesSQL;Integrated Security=True;"
   Private cnnStr As String = "Data Source=.\SQLEXPRESS; Initial Catalog=conImagenes2;Integrated Security=True;"
   Private dt As New DataTable
   Private dtNavegador As TablaNavegar
   Private Sub habilitarControles(ByVal habilitar As Boolean)
    ' Habilitar/deshabilitar los controles según se indique
    Me.BindingNavigatorDeleteItem.Enabled = habilitar
    Me.BindingNavigatorMoveFirstItem.Enabled = habilitar
    Me.BindingNavigatorMoveLastItem.Enabled = habilitar
    Me.BindingNavigatorMoveNextItem.Enabled = habilitar
    Me.BindingNavigatorMovePreviousItem.Enabled = habilitar
   End Sub
   Private Sub actualizarNavegacion()
    ' Actualizar los controles de navegación
    actualizarNavegacion(True)
   End Sub
   Private Sub actualizarNavegacion(ByVal mostrarFila As Boolean)
    ' Actualizar los controles de navegación
    ' Si mostrarFila = True se muestra la fila actual
    Me.IDTextBox.Text = ""
    Me.NombreTextBox.Text = ""
    Me.FotoPictureBox.Image = Nothing
    If mostrarFila AndAlso dtNavegador.NumeroUltimaFila >= 0 Then
	    Dim dr As DataRow = dtNavegador.FilaActual
	    If dr IsNot Nothing Then
		    Me.IDTextBox.Text = dr("ID").ToString
		    Me.NombreTextBox.Text = dr("Nombre").ToString
		    If dr("Foto") IsNot DBNull.Value Then
			    Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte()))
			    If img IsNot Nothing Then
				    Me.FotoPictureBox.Image = img
				    Me.clon.Image = img
				    'Else
				    '    img = TryCast(dr("Foto"), Bitmap)
				    '    If img IsNot Nothing Then
				    '	    Me.FotoPictureBox.Image = img
				    '    End If
			    End If
		    End If
	    End If
    End If
    habilitarControles(False)
    If dtNavegador.NumeroUltimaFila >= 0 Then
	    BindingNavigatorPositionItem.Text = (dtNavegador.NumeroFilaActual + 1).ToString
	    BindingNavigatorCountItem.Text = "de " & (dtNavegador.NumeroUltimaFila + 1).ToString
	    'habilitarControles(True)
	    If dtNavegador.NumeroFilaActual > 0 Then
		    Me.BindingNavigatorMoveFirstItem.Enabled = True
		    Me.BindingNavigatorMovePreviousItem.Enabled = True
	    End If
	    If dtNavegador.NumeroFilaActual < dtNavegador.NumeroUltimaFila Then
		    Me.BindingNavigatorMoveLastItem.Enabled = True
		    Me.BindingNavigatorMoveNextItem.Enabled = True
	    End If
    Else
	    BindingNavigatorPositionItem.Text = "0"
	    BindingNavigatorCountItem.Text = "de 0"
    End If
   End Sub
   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.IDTextBox.Enabled = False
    habilitarControles(False)
    Dim da As New SqlDataAdapter("SELECT * FROM conFotos", cnnStr)
    Try
	    da.Fill(dt)
	    dtNavegador = New TablaNavegar(dt)
	    actualizarNavegacion(True)
    Catch ex As Exception
	    MessageBox.Show("ERROR al cargar los datos:" & vbCrLf & _
					    ex.Message, "Error al cargar los datos", _
					    MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
	    'Exit Sub
    End Try
   End Sub
   Private Sub ConFotosBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConFotosBindingNavigatorSaveItem.Click
    ' Guardar los datos en la tabla
    Dim da As New SqlDataAdapter("SELECT * FROM conFotos", cnnStr)
    Try
	    Dim cb As New SqlCommandBuilder(da)
	    da.UpdateCommand = cb.GetUpdateCommand(True)
	    da.InsertCommand = cb.GetInsertCommand(True)
	    da.DeleteCommand = cb.GetDeleteCommand(True)
	    da.Update(dt)
	    dt.AcceptChanges()
    Catch ex As Exception
	    MessageBox.Show("ERROR al guardar los datos:" & vbCrLf & _
					    ex.Message, "Error al guardar los datos", _
					    MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    End Try
   End Sub
   Private Sub BindingNavigatorAddNewItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorAddNewItem.Click
    ' Agregar un nuevo elemento
    ' Se añade un nuevo registro y se muestra vacío
    Dim dr As DataRow = dt.NewRow
    dt.Rows.Add(dr)
    dtNavegador.ActualizarTabla(dt)
    dtNavegador.Ultima()
    actualizarNavegacion(True)
   End Sub
   Private Sub BindingNavigatorDeleteItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorDeleteItem.Click
   End Sub
   Private Sub BindingNavigatorMoveFirstItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorMoveFirstItem.Click
    dtNavegador.Primera()
    actualizarNavegacion(True)
   End Sub
   Private Sub BindingNavigatorMovePreviousItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorMovePreviousItem.Click
    dtNavegador.Anterior()
    actualizarNavegacion(True)
   End Sub
   Private Sub BindingNavigatorMoveNextItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorMoveNextItem.Click
    dtNavegador.Siguiente()
    actualizarNavegacion(True)
   End Sub
   Private Sub BindingNavigatorMoveLastItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorMoveLastItem.Click
    dtNavegador.Ultima()
    actualizarNavegacion(True)
   End Sub
   Private Sub ConFotosActualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConFotosActualizar.Click
    ' Actualizar los datos actuales en la fila actual
    Dim dr As DataRow = dtNavegador.FilaActual
    If dr Is Nothing Then
	    dr = dt.NewRow
	    dt.Rows.Add(dr)
	    dtNavegador.ActualizarTabla(dt)
    End If
    dr("Nombre") = Me.NombreTextBox.Text
    dr("Foto") = TablaNavegar.Image2Bytes(Me.FotoPictureBox.Image)
   End Sub
   Private Sub btnExaminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExaminar.Click
    ' Seleccionar la imagen
    Dim oFD As New OpenFileDialog
    oFD.Title = "Selecccionar la imagen"
    oFD.Filter = "Todos (*.*)|*.*|Imagenes|*.jpg;*.gif;*.png;*.bmp"
    If oFD.ShowDialog = Windows.Forms.DialogResult.OK Then
	    ' La cantidad de caracteres máximo
	    ' (por si el path es demasiado largo)
	    Dim i As Integer = dt.Columns("Nombre").MaxLength
	    If i < 0 Then i = 255
	    ' El nombre del fichero
	    ' Nos quedamos solo con el nombre, sin el path
	    Dim sNombre As String = System.IO.Path.GetFileName(oFD.FileName)
	    If sNombre.Length > i Then
		    ' Si el nombre es más grande de lo permitido, lo cortamos
		    sNombre = sNombre.Substring(0, i)
	    End If
	    Me.NombreTextBox.Text = sNombre
	    Me.FotoPictureBox.Image = Image.FromFile(oFD.FileName)
    End If
   End Sub
   Private Sub btnMostrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMostrar.Click
    My.Forms.FormMostrar.CadenaConexion = cnnStr
    My.Forms.FormMostrar.Show()
   End Sub
End Class

 

 

En la siguiente Linea copio solamente la misma imagen el el picturebox clone

 

 

Me.FotoPictureBox.Image = img

Me.clon.Image = img

 

Pero mi intención es capturar id distintas en ambos picturebox.

 

 

Saludos

Link to comment
Share on other sites

Algo asi sería??:

 

 

If dr IsNot Nothing Then

Me.IDTextBox.Text = dr("ID").ToString

Me.NombreTextBox.Text = dr("Nombre").ToString

If dr("Foto") IsNot DBNull.Value Then

Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte()))

If img IsNot Nothing Then

Me.FotoPictureBox.Image = img

 

'Else

' img = TryCast(dr("Foto"), Bitmap)

' If img IsNot Nothing Then

' Me.FotoPictureBox.Image = img

' End If

End If

End If

 

 

If dr("FotoB") IsNot DBNull.Value Then

Dim imgb As Image = TablaNavegar.Bytes2Image(CType(dr("FotoB"), Byte()))

If imgb IsNot Nothing Then

 

Me.clon.Image = imgb

'Else

' img = TryCast(dr("Foto"), Bitmap)

' If img IsNot Nothing Then

' Me.FotoPictureBox.Image = img

' End If

End If

End If

End If

 

 

Eso suponiendo que tu primera foto se llame Foto y tu segunda foto se llamase FotoB en tu BD.

 

 

Saludos :krider:

Edited by AshWilliams
Link to comment
Share on other sites

Intento y comento ;) , salu2

 

 

Edito:

 

Me tira un error. "ERROR al cargar datos, La columna 'FotoB' no pertenece a la tabla.

 

 

Mi Base dato tiene los siguientes campos.

 

ID (con identidad) Nombre Foto(Image, esta ultima almacena las imágenes en dato binario)

 

El problema por el cual reclama es porque no existe la Columna FotoB.

 

Quiero saber como puedo cargar la imagen de la misma columna Foto pero con la siguiente ID.

Edited by Minino666
Link to comment
Share on other sites

En el conjunto de resultados (DataTable) tienes 2 filas (tuplas) para cada foto... porque son ID distintos...

 

El mismo ejemplo que pusiste:

 

ID Image Nombre

1 imagen.jpg rojo

2 imagen2.jpg verde

 

Cuando haces la asignación, el dr corresponde a la fila con ID 1... Por lo tanto, para sacar la otra foto, tienes q asignarle al dr, la siguiente fila.

 

Dim dr As DataRow = dtNavegador.FilaActual
If dr IsNot Nothing Then
 Me.IDTextBox.Text = dr("ID").ToString
 Me.NombreTextBox.Text = dr("Nombre").ToString
 If dr("Foto") IsNot DBNull.Value Then
   Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte()))
   If img IsNot Nothing Then Me.FotoPictureBox.Image = img
 End If

 Dim dr As DataRow = dtNavegador.Siguiente()
 If dr("Foto") IsNot DBNull.Value Then
   Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte()))
   If img IsNot Nothing Then
     Me.clon.Image = img
   End If
 End If
End If

 

O algo así...

 

Suerte! ;)

Link to comment
Share on other sites

En el conjunto de resultados (DataTable) tienes 2 filas (tuplas) para cada foto... porque son ID distintos...

 

El mismo ejemplo que pusiste:

 

ID Image Nombre

1 imagen.jpg rojo

2 imagen2.jpg verde

 

Cuando haces la asignación, el dr corresponde a la fila con ID 1... Por lo tanto, para sacar la otra foto, tienes q asignarle al dr, la siguiente fila.

 

Dim dr As DataRow = dtNavegador.FilaActual
If dr IsNot Nothing Then
 Me.IDTextBox.Text = dr("ID").ToString
 Me.NombreTextBox.Text = dr("Nombre").ToString
 If dr("Foto") IsNot DBNull.Value Then
Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte()))
If img IsNot Nothing Then Me.FotoPictureBox.Image = img
 End If

 Dim dr As DataRow = dtNavegador.Siguiente()
 If dr("Foto") IsNot DBNull.Value Then
Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte()))
If img IsNot Nothing Then
  Me.clon.Image = img
End If
 End If
End If

 

O algo así...

 

Suerte! ;)

 

 

Gracias Ra por la corrección, yo pensaba que tenías 2 fotos por ID, pero si es con ids distintos y fotos distintas el ejemplo citado debería funcionar.

 

 

Saludos :krider:

Link to comment
Share on other sites

Gracias RA y AshWillians por contestar, eh probado pero me causa un error de código en la siguiente linea.

 

Dim dr As DataRow = dtNavegador.FilaActual
If dr IsNot Nothing Then
 Me.IDTextBox.Text = dr("ID").ToString
 Me.NombreTextBox.Text = dr("Nombre").ToString
 If dr("Foto") IsNot DBNull.Value Then
	Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte()))
	If img IsNot Nothing Then Me.FotoPictureBox.Image = img
 End If
[color=#ff0000][b]  Dim dr As DataRow = dtNavegador.Siguiente()[/b][/color]
 If dr("Foto") IsNot DBNull.Value Then
	Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte()))
	If img IsNot Nothing Then
	  Me.clon.Image = img
	End If
 End If
End If

 

La Variable local 'dr' ya se ah declarado en el bloque actual.

 

Probe renombrado la segundar parte del código donde apunta a siguiente con otra variable ejm 'dr2' pero sin efecto.

 

 

EDIT.

 

Intente con 2 formas lo primero eliminar que se haya declarado la variable 2 veces.

 

dr = dtNavegador.Siguiente()

 

Pero se generan muchos problemas, no guarda ni respeta el indice.

 

la segunda opcion fue ingresar el codigo en un button.

 

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim dr As DataRow = dtNavegador.Siguiente
    If dr IsNot Nothing Then
	    Me.IDTextBox.Text = dr("ID").ToString
	    Me.NombreTextBox.Text = dr("Nombre").ToString
	    If dr("Foto") IsNot DBNull.Value Then
		    Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte()))
		    If img IsNot Nothing Then
			    Me.clon.Image = img
		    End If
	    End If
    End If
   End Sub

 

Lo cual captura el elemento siguiente al anterior, pero como cargar ambos elementos a la vez? ya que me hace depender de un button.

Edited by Minino666
Link to comment
Share on other sites

Claro... lo que pasa es que el método Siguiente() hace que el índice aumente en 1...

 

Podrías hacer un nuevo método en la clase TablaNavegar que te traiga la siguiente fila, pero sin aumentar el índice... Puede ser algo así:

 


Public Function SiguienteNoMove() As DataRow
   Return laTabla.Rows(laFila + 1)
End Function

 

Y la usas así:


Dim dr As DataRow = dtNavegador.FilaActual
If dr IsNot Nothing Then
 Me.IDTextBox.Text = dr("ID").ToString
 Me.NombreTextBox.Text = dr("Nombre").ToString
 If dr("Foto") IsNot DBNull.Value Then
Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte()))
If img IsNot Nothing Then Me.FotoPictureBox.Image = img
 End If

 dr = dtNavegador.SiguienteNoMove()

 If dr("Foto") IsNot DBNull.Value Then
Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte()))
If img IsNot Nothing Then Me.clon.Image = img
 End If
End If

 

Salu2.

Edited by Ra
Link to comment
Share on other sites

Gracias RA, funciono tal cual lo necesitaba.

 

Una ultima consulta es posible capturar una imagen X en la fila y cargarla en un 3er Picturebox.

 

Es tan facil como tener un textbox y comprarlo??

 

if (Textbox.text = laFila)

 

Para capturar una imagen que yo desee.

 

 

Re-itero Muchas gracias otra vez.

 

 

 

Problemas solucionados , Gracias RA y AshWilliams por todas las ayudas ;)

Edited by Minino666
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...