none
Hacer consultas en sql

    Pregunta

  • Mi duda es la siguiente, ya se como hacer consultas en SQL, pero tengo esta duda

    Como puedo hacer una consulta a una Tabla de sql y almacenar los datos, pero sin mostrarlos, es decir lo siguiente:

    Tengo una caja de texto que dice codigo y una tabla en sql llamada productos donde estan los campos de descripcion y precio, quiero que al ingresar el codigo en textbox me devuelva la descripcion y el precio pero sin mostrar los datos en ningun lado, que los almacene temporalmente, luego apretar un boton agregar y aregarlos a un datagridview , asi me ahorro las demas cajas de texto

    domingo, 2 de octubre de 2016 22:08

Respuestas

  • Hola El_vena,

    Para no crear variables individuales, podrías crear una clase que almacene los valores.

    Clase :

       Public Class Producto
            Public Property descripcion As String
            Public Property precio As Double
        End Class

    Además, crearías una función que requiera un código de tipo string, y devuelva un objeto de tipo Producto.

    Public Function obtenerDatos(ByVal cod As String) As Producto Dim sql As String = String.Empty Dim product As Producto = Nothing Try Using con As New SqlConnection("MiCadenaConexion") con.Open() sql = "Select descripcion, precio from Productos where codigo = @cod" Dim cmd As New SqlCommand(sql, con) cmd.Parameters.AddWithValue("@cod", cod) Dim dr = cmd.ExecuteReader 'Si hay resultado If dr.HasRows Then If dr.Read() Then

    'Crea un nuevo objeto y asigna los valores product = New Producto() _ With {.precio = Convert.ToDouble(dr("precio")), .descripcion = Convert.ToString(dr("descripcion"))} End If End If Return product End Using Catch ex As Exception MessageBox.Show(ex.Message) Return product End Try End Function

    Y para llamarlo desde algún evento :

            Dim p As Producto = obtenerDatos(txtCodigo.Text)
    
            'Si p no es nulo, es porque encontró
            If p IsNot Nothing Then
                'Obtenemos los datos mediante los atributos
                MessageBox.Show(p.descripcion)
                MessageBox.Show(p.precio.ToString)
            End If

    Solo sería cuestión de cambiar los tipos de datos según tu estructura.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    domingo, 2 de octubre de 2016 22:39
  • El_vena,

    Puedes implementar un procedimiento Function que retorne un objeto de tipo DataTable (una fila):

    Public Function ObtenerProducto(Codigo As String) As DataTable
    	Try
    		Using cn As New SqlConnection("<Colocar cadena de conexión>")
    
    			Dim ConsultaSQL As String = "SELECT Codigo, Descripcion, Precio FROM Productos WHERE Codigo = @Codigo"
    
    			Dim cmd As New SqlCommand(ConsultaSQL, cn)
    			cmd.Parameters.AddWithValue("@Codigo", Codigo)
    
    			Dim da As New SqlDataAdapter(cmd)
    			Dim dt As New DataTable
    			da.Fill(dt)
    
    			Return dt
    		End Using
    	Catch ex As Exception
    		MessageBox.Show(ex.Message)
    
    		Return Nothing
    	End Try
    End Function


    El procedimiento lo invocas de la siguiente manera:

    Dim datos = ObtenerProducto(txtCodigo.Text) 'Invoca al procedimiento ObtenerProducto()
    
    If datos IsNot Nothing Then 'Si el procedimiento no retorna Nothing hacer
    	
    	Dim row As DataRow = datos.Rows(0) 'Establece una referencia a la primera fila
    	
    	DGV.Rows.Add(Convert.ToString(datos["Descripcion"], Convert.ToDecimal(datos["Precio"])
    End If



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    domingo, 2 de octubre de 2016 22:43

Todas las respuestas

  • Hola El_vena,

    Para no crear variables individuales, podrías crear una clase que almacene los valores.

    Clase :

       Public Class Producto
            Public Property descripcion As String
            Public Property precio As Double
        End Class

    Además, crearías una función que requiera un código de tipo string, y devuelva un objeto de tipo Producto.

    Public Function obtenerDatos(ByVal cod As String) As Producto Dim sql As String = String.Empty Dim product As Producto = Nothing Try Using con As New SqlConnection("MiCadenaConexion") con.Open() sql = "Select descripcion, precio from Productos where codigo = @cod" Dim cmd As New SqlCommand(sql, con) cmd.Parameters.AddWithValue("@cod", cod) Dim dr = cmd.ExecuteReader 'Si hay resultado If dr.HasRows Then If dr.Read() Then

    'Crea un nuevo objeto y asigna los valores product = New Producto() _ With {.precio = Convert.ToDouble(dr("precio")), .descripcion = Convert.ToString(dr("descripcion"))} End If End If Return product End Using Catch ex As Exception MessageBox.Show(ex.Message) Return product End Try End Function

    Y para llamarlo desde algún evento :

            Dim p As Producto = obtenerDatos(txtCodigo.Text)
    
            'Si p no es nulo, es porque encontró
            If p IsNot Nothing Then
                'Obtenemos los datos mediante los atributos
                MessageBox.Show(p.descripcion)
                MessageBox.Show(p.precio.ToString)
            End If

    Solo sería cuestión de cambiar los tipos de datos según tu estructura.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    domingo, 2 de octubre de 2016 22:39
  • El_vena,

    Puedes implementar un procedimiento Function que retorne un objeto de tipo DataTable (una fila):

    Public Function ObtenerProducto(Codigo As String) As DataTable
    	Try
    		Using cn As New SqlConnection("<Colocar cadena de conexión>")
    
    			Dim ConsultaSQL As String = "SELECT Codigo, Descripcion, Precio FROM Productos WHERE Codigo = @Codigo"
    
    			Dim cmd As New SqlCommand(ConsultaSQL, cn)
    			cmd.Parameters.AddWithValue("@Codigo", Codigo)
    
    			Dim da As New SqlDataAdapter(cmd)
    			Dim dt As New DataTable
    			da.Fill(dt)
    
    			Return dt
    		End Using
    	Catch ex As Exception
    		MessageBox.Show(ex.Message)
    
    		Return Nothing
    	End Try
    End Function


    El procedimiento lo invocas de la siguiente manera:

    Dim datos = ObtenerProducto(txtCodigo.Text) 'Invoca al procedimiento ObtenerProducto()
    
    If datos IsNot Nothing Then 'Si el procedimiento no retorna Nothing hacer
    	
    	Dim row As DataRow = datos.Rows(0) 'Establece una referencia a la primera fila
    	
    	DGV.Rows.Add(Convert.ToString(datos["Descripcion"], Convert.ToDecimal(datos["Precio"])
    End If



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    domingo, 2 de octubre de 2016 22:43