none
Cargar ComboBox con DataReader.

    Pregunta

  • Como obtengo el Datasource para llenar el ComboBox.

        Sub CargarCombo()
    
            StrSQL = "SELECT * FROM filtros WHERE tipo='MARCA'"
            strComando = New MySqlCommand(StrSQL, strConexion)
            rsReader = strComando.ExecuteReader
    
            While rsReader.Read
                ComboBox1.DisplayMember = "nombres"
                ComboBox1.ValueMember = "id"
                ComboBox1.DataSource = "QUE HAY QUE PONER ACA"
            End While
    
        End Sub

    Se como hacer con el drReader.Fill(dtFiltros), pero quiero saber si se puede hacer con el DataReader.

    Saludos...

    • Editado E N T E R miércoles, 10 de abril de 2013 23:49
    miércoles, 10 de abril de 2013 23:46

Todas las respuestas

  • podrias cargas una entidad que tu crees, una lista

     Sub CargarCombo()
    
    	StrSQL = "SELECT * FROM filtros WHERE tipo='MARCA'"
    	strComando = New MySqlCommand(StrSQL, strConexion)
    	rsReader = strComando.ExecuteReader
    
    	Dim lista As New List(Of Dato)
    	While rsReader.Read
    		Dim item As New Dato
    		item.Id = CInt(rsReader("nombrecampo1"))
    		item.Desc = CStr(rsReader("nombrecampo2"))
    		lista.Add(item)
    	End While
    
    	ComboBox1.DisplayMember = "Desc"
    	ComboBox1.ValueMember = "Id"
    	ComboBox1.DataSource = lista
    		
    End Sub

    para esto necesita definir una clase

    Public Class Dato
    	Public Property Id As Integer
    	Public Property Desc As String
    End Class

    Nota: la forma en que defini las propiedades requieren .net 4 o superior, sino vas a tener que definirlas de forma completa

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 11 de abril de 2013 0:22
  • Gracias Leandro con el tema de propiedad por cual me decís y que consecuencias puede tener eso.

    Saludos...

    jueves, 11 de abril de 2013 0:27
  • Hola:

     Y porque simplemente no devuelves un DataTable en una función? de esta manera de evitas el DataReader.

    	    Public Shared Function CargarProveedores() As DataTable
            Try
                Using cnx As New MySqlConnection(ConfigurationManager.ConnectionStrings("CadenaConexion").ToString())
                    Dim SqlCargar As String
                    SqlCargar = "SELECT NumProveedor, NomProveedor FROM Proveedores WHERE NumProveedor = @NumProveedor"
    
                    Using cmd As New MySqlCommand(SqlCargar, cnx)
    				    cmd.Parameters.AddWithValue("@NumProveedor", Convert.ToInt32(TextBox1.Text.Trim()))
                        Dim da As New MySqlDataAdapter(cmd)
                        Dim dt As New DataTable
                        da.Fill(dt)
                        Return dt
                    End Using
                End Using
            Catch ex As Exception
                Throw
            End Try
        End Function

    Lo mandas a llamar en el Evento Click de un boton por ejemplo:

    	
    	Private Sub Button1_Click(...)
    		Try
    			ComboBox1.DataSource = CargarProveedores()
    			ComboBox1.DisplayMember = "NomProveedor"
    			ComboBox1.ValueMember = "NumProveedor"
    		Catch ex As Exception
    			MessageBox.Show(ex.message)
    		End Try
    	End Sub

     Bien podrias usar tu funcion en cualquier otro envento...


    Saludos desde Monterrey, Nuevo León, México!!!

    jueves, 11 de abril de 2013 0:36
  • Es a según los expertos, que el DataReader es mas rápido y no ocupa en memoria.

    solo por eso amigo yo de esa forma como vos indicas lo tengo luego solo quería saber si se podía cargar con el datareader para tener una aplicación optimo.

    Saludos...

    jueves, 11 de abril de 2013 0:52
  • Mmmm no creo que sea mucha la diferencia en tiempo de respuesta, puesto que lo mas tardado seria traer los datos, ni tampoco mucha memoria la que se consuma...pero vemos que opinan los Expertos... :D


    Saludos desde Monterrey, Nuevo León, México!!!

    jueves, 11 de abril de 2013 1:10
  • Por que esta forma no me funciona el DataSource.

        Dim conn As MySqlConnection
        Dim reader As MySqlDataReader
    
        Private Function ReadRecords(ByVal query As String) As MySqlDataReader
    
            Dim ConnString As String = "Data SOURCE=localhost;DATABASE=stock;USER ID=root;Password="
            conn = New MySqlConnection(ConnString)
            conn.Open()
    
            Dim cmd As New MySqlCommand(query, conn)
            reader = cmd.ExecuteReader()
    
            Return reader
    
        End Function
    
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    
            ComboBox1.DisplayMember = "nombres"
            ComboBox1.ValueMember = "id"
            ComboBox1.DataSource = ReadRecords("SELECT * FROM filtros WHERE tipo='MARCA'")
    
        End Sub

    Error que me da:

    El DataBinding complejo acepta como origen de datos IList o IListSource.

    jueves, 11 de abril de 2013 1:10
  • el tema de propiedad por cual me decís y que consecuencias puede tener eso.

    estas usnado .net 4 ?

    sino decia que uses

    Private _id As Integer
    
    Public Property Id
       Get
            Return _id
       End Get
       Set
          _id = Value
       End Set
    End Property



    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 11 de abril de 2013 1:44
  • no creo que sea mucha la diferencia en tiempo de respuesta,

    si que hay mucho tiempo de respuesta y de consumo de recursos para mantener la metadata, pero no lo realices con 10 registros

    carga 100 en una lista y realiza un Fill() y toma el tiempo, alli si veras la diferencia

    porque crees que el datatable de ser posible no se deberia usar mas

    Nota: igualmente hay que reconocer que para alguien que recien comienza el datatablee s el objeto mas simple de entender y utilizar para recuperar datos, aunque a nivel de performace no sea lo mejor


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 11 de abril de 2013 1:47
  • El DataBinding complejo acepta como origen de datos IList o IListSource.

    el error te lo dice bien claro, requeires de un objeto desconectado para poder bindear y el reader justamente es todo lo contrario


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 11 de abril de 2013 1:48
  • Gracias por todo Leandro me funciono de lujo. La verdad probé con 7000 registros y con el DataTable tarda como 5 sg. en cargar con el DataReader ni 1 segundo. 

    Acá dejo con unas modificaciones por si le sirve a alguien

    Public Class DatosCombo
        Public Property xValue As Integer
        Public Property xDisplay As String
    End Class
    
    Sub CargarCombo_Data_Reader(ByVal strQuery As String, ByVal xCombo As ComboBox)
    
        StrSQL = strQuery
        strComando = New MySqlCommand(StrSQL, strConexion)
        rsReader = strComando.ExecuteReader
    
        Dim Lista As New List(Of DatosCombo)
        While rsReader.Read
            Dim item As New DatosCombo
            item.xValue = CInt(rsReader("numero"))
            item.xDisplay = CStr(rsReader("matriz"))
            Lista.Add (item)
        End While
    
        xCombo.DisplayMember = "xDisplay"
        xCombo.ValueMember = "xValue"
        xCombo.DataSource = Lista
    
    End Sub
    
    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Call CargarCombo_Data_Reader("SELECT * FROM matriz", ComboBox1)
    End Sub


    jueves, 11 de abril de 2013 23:57
  • Wow, me quedo con el conocimiento de este tema.

    Saludos desde Monterrey, Nuevo León, México!!!

    viernes, 12 de abril de 2013 3:47