none
buscar registros RRS feed

  • Pregunta

  • Buenas.

    Tengo un quebradero de cabeza que me pregunto si alguien me podria ayudar ??

    Como el titulo dice , es buscar registros.

    E intentado todo lo que e podido , e mirado muchisimos link y seguido otros tantos tutoriales pero siempre pasa algo que no se resolver .

    Tengo que decir que soy muy novato en esto y no se programacion.

    Este es el codigo que creo que me pudiese servir mejor de los mucho tutoriales que segui:

    ESTE ES EL MODULO:


    Option Compare Text
    Imports System.Runtime.CompilerServices
    Public Module DataGridViewExtensions

    #Region "Find"
        ''' <summary>
        ''' La función devolverá una lista de objetos DataGridViewRow
        ''' que satisfagan el criterio de búsqueda especificado.
        ''' </summary>
        ''' <param name="dgv">Control DataGridView.</param>
        ''' <param name="fieldName">Nombre de la columna por donde se desea buscar.</param>
        ''' <param name="criterio">Valor con el criterio de búsqueda deseado.</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        <Extension()> _
        Public Function Find( _
            ByVal dgv As DataGridView, _
            ByVal fieldName As String, _
            ByVal criterio As String) As List(Of DataGridViewRow)

            ' Comprobamos los valores de los parámetros.
            '
            If (fieldName = String.Empty) OrElse _
                (criterio = String.Empty) Then Return Nothing

            ' Para que funcione adecuadamente el operador Like, hay que establecer
            ' Option Compare Text a nivel del módulo donde aparezca la función,
            ' o a nivel del proyecto.
            '
            Try
                Dim query As IEnumerable(Of DataGridViewRow) = _
                    From item As DataGridViewRow In dgv.Rows.Cast(Of DataGridViewRow)() _
                    Where ((item.Cells(fieldName).Value IsNot DBNull.Value) AndAlso _
                          (CStr(item.Cells(fieldName).Value) Like criterio)) _
                    Select item

                ' Devolvemos la consulta LINQ ejecutada.
                Return query.ToList()

            Catch ex As Exception
                Return Nothing

            End Try

        End Function

        ''' <summary>
        ''' Hace que el control DataGridView se desplace a la posición indicada
        ''' dentro del conjunto de filas que satisfacen el criterio de búsqueda
        ''' especificado en el método Find.
        ''' </summary>
        ''' <param name="dgv">Control DataGridView.</param>
        ''' <param name="position">Índice de la posición a la que desea desplazarse.</param>
        ''' <param name="listRows">Lista de objetos DataGridViewRow.</param>
        ''' <remarks></remarks>
        <Extension()> _
        Public Sub Find(ByVal dgv As DataGridView, ByVal position As Int32, ByVal listRows As List(Of DataGridViewRow))

            If (listRows Is Nothing) Then _
                Throw New InvalidOperationException( _
                    "Operación no válida. " & _
                    "Establezca primero los criterios de búsqueda " & _
                    "mediante el método Find.")

            ' Seleccionamos el elemento correspondiente a la
            ' posición actual especificada.
            '
            Dim row As DataGridViewRow = listRows.ElementAtOrDefault(position)

            If ((row IsNot Nothing) AndAlso (row.Index <> -1)) Then
                ' Establecemos la celda actual si el índice de la fila
                ' no es igual a -1.
                '
                dgv.CurrentCell = dgv.Rows(row.Index).Cells(0)
                dgv.FirstDisplayedCell = dgv.CurrentCell

            End If

        End Sub

    #End Region

    End Module


    ESTE ES EL DEL FORMULARIO:


    Imports System.Data.SqlClient

     

    Public Class Form1

        Private m_bs As BindingSource
        Private m_listRows As List(Of DataGridViewRow)

        Private Sub Form1_Load( _
            ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles MyBase.Load
            'TODO: esta línea de código carga datos en la tabla 'NorthwindDataSet.Customers' Puede moverla o quitarla según sea necesario.
            Me.CustomersTableAdapter.Fill(Me.NorthwindDataSet.Customers)

            ' Creamos una instancia del objeto BindingSource.
            '
            m_bs = New BindingSource

            ' Instalamos el controlador de evento PositionChanged.
            '
            AddHandler m_bs.PositionChanged, AddressOf PositionChanged

            ' Asociamos el control BindingNavigator
            ' con el control BindingSource.
            '
            BindingNavigator1.BindingSource = m_bs

            ' Hacemos invisibles los siguientes controles
            ' del control BindingNavigator.
            '
            BindingNavigatorAddNewItem.Visible = False
            BindingNavigatorDeleteItem.Visible = False

            ' Establecemos el valor de la propiedad Text de
            ' los siguientes controles.
            '
            Label1.Text = "&Columna de búsqueda"
            Label2.Text = "Criterio de búsqued&a"
            Button1.Text = "&Buscar"
            Me.Text = "Cómo buscar registros en un control DataGridView"

            ' Obtenemos un objeto DataTable con los datos de la
            ' tabla Customers de la base de datos Northwind.
            '
            Dim dt As DataTable = GetData()

            If (dt Is Nothing) Then Return

            ' Enlazamos el control DataGridView.
            '
            DataGridView1.DataSource = dt

            ' Rellenamos el control ComboBox con los nombres
            ' de las columnas del objeto DataGridView, que en
            ' éste caso, se corresponderán con los nombres de
            ' las columnas del objeto DataTable.
            '
            For Each col As DataGridViewColumn In DataGridView1.Columns
                ComboBox1.Items.Add(col.Name)
            Next

            ' Seleccionamos el primer elemento e indicamos
            ' el estilo que tendrá el control ComboBox.
            '
            ComboBox1.SelectedIndex = 0
            ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList

        End Sub

        Private Sub Button1_Click( _
            ByVal sender As Object, _
            ByVal e As EventArgs) Handles Button1.Click

            Dim fieldName As String = ComboBox1.Text
            Dim criterio As String = TextBox1.Text

            ' Recuperamos las filas que cumplan con el criterio especificado.
            '
            m_listRows = DataGridView1.Find(fieldName, criterio)

            ' Asignamos el origen de datos del objeto BindingSource.
            '
            m_bs.DataSource = m_listRows

        End Sub

        Private Sub PositionChanged(ByVal sender As Object, ByVal e As EventArgs)

            ' Utilizamos la segunda sobrecarga del método Find,
            ' para posicionarnos en el registro que coincida
            ' con el valor de la propiedad Position del control
            ' BindingSource.
            '
            DataGridView1.Find(m_bs.Position, m_listRows)

        End Sub

        Private Function GetData() As DataTable

            Using cnn As New SqlConnection( _
                "Data Source=(local);" & _
                "Initial Catalog=Northwind;" & _
                "Integrated Security=SSPI;")

                Try
                    Dim sql As String = _
                    "SELECT CustomerID, CompanyName, ContactName, " & _
                    "City, PostalCode, Country FROM Customers"

                    Dim da As New SqlDataAdapter(sql, cnn)

                    Dim dt As New DataTable("Customers")

                    da.Fill(dt)

                    Return dt

                Catch ex As Exception
                    MessageBox.Show(ex.Message)
                    Return Nothing

                End Try

            End Using

        End Function

     

    y utilizo los siguientes controles :

    • Un control BindingNavigator, para movernos por los registros encontrados.
    • Dos controles Label.
    • Un control ComboBox, para seleccionar la columna por donde deseamos buscar.
    • Un control TextBox, para especificar el criterio de búsqueda.
    • Un control Button, para iniciar la búsqueda.
    • Un control DataGridView, que digamos, es el actor principal del formulario.

     

    Cuando depuro me aparece un mensaje que dice esto:

    No se puede abrir la base de datos "Northwind" solocitada por el inicio de sesion.

    Error de inicio de sesion.

    Error de inicio de sesion del usuario '*****\*****'.

     

    Lo que e encontrado sobre esto es que no tengo los privilegios suficientes para abrirla por el tema de la autentificacion creo que es.

    Alguien sabe como sulocionar esto?? y hacer que funcione ??

    Un saludo.


    davidd88
    • Cambiado Enrique M. Montejo miércoles, 28 de septiembre de 2011 15:23 acceso a datos (De:Lenguaje VB.NET)
    lunes, 26 de septiembre de 2011 19:11

Todas las respuestas

  • Hola davidd88

    mira si lo que estas buscando es solamente buscar, osea que pongas por decir el codigo o algun digito y que este lo busque y si lo encuentra que este se muestre en un datagripview, pues yo lo hago asi, derrepente te sirve.

     

    Crea un modulo y pon esto:

    Public cn As String = "TU CADENA DE CONEXION.."


    Public Function GetData(ByVal cmd As SqlCommand) As DataTable
            If (cmd Is Nothing) Then _
              Throw New ArgumentNullException()
            Try
                ' Configuramos una conexión con la base de SQL Server.
                Using cnn As New SqlConnection(cn)
                    ' Le asignamos la conexión al comando
                    cmd.Connection = cnn
                    ' Creamos un adaptador de datos
                    Dim da As New SqlDataAdapter(cmd)
                    ' Creamos un objeto DataTable
                    Dim dt As New DataTable()
                    ' Rellenamos el objeto DataTable
                    da.Fill(dt)
                    ' Devolvemos el objeto DataTable
                    Return dt
                End Using
            Catch ex As Exception
                ' Devolvemos el error al procedimiento llamador
                Throw
            End Try
        End Function

    luego en el formulario, en el boton buscar del formulario pon esto:

    Private Sub btnbuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnbuscar.Click

    Try
                Dim cmd As New SqlCommand()

                cmd.CommandText = _
                    "SELECT * FROM TU_TABLA " & _
                    "WHERE TU_CAMPO = @TU_CAMPO"

                ' Añadimos el parámetro de entrada
                cmd.Parameters.AddWithValue("@TU_CAMPO", TEXTBOX1.Text)

                ' Obtenemos el objeto DataTable
                Dim dt As DataTable = GetData(cmd)

                ' Si existen registros en el objeto DataTable
               ' los mostramos en un control DataGridView.

                If (dt.Rows.Count > 0) Then
                    DATAGRIPVIEW1.DataSource = dt
                Else
                    DATAGRIPVIEW1.DataSource = Nothing
                   MessageBox.Show("No existe el ID especificado.")
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message)
           End Try
        End Subun

    y bueno eso es todo lo que necesitas para que cuando ingreses un codigo o algun texto en un textbox si este coincide con la base de datos lo muestre....


    AH por cierto asegurate que en tu sql  estes usando la base de datos northwind y que no este otra en uso...
    • Editado jcuroca lunes, 26 de septiembre de 2011 19:44
    lunes, 26 de septiembre de 2011 19:40
  • hola

    has validado la cadena de conecion, o sea esta parte

    Using cnn As New SqlConnection( _
                "Data Source=(local);" & _
                "Initial Catalog=Northwind;" & _
                "Integrated Security=SSPI;")

    es correcta la db que alli defines ?

    tienes el sql server local instalado, con una db de nombre Northwind dentro del servicio

    sino lo tienes bueno alli esta el error, debes cambiar esa parte ingresandfo la info correcta que conecte a la db que tu usas

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 26 de septiembre de 2011 19:41
  • "davidd88" escribió:

    > Cuando depuro me aparece un mensaje que dice esto:
    >
    > No se puede abrir la base de datos "Northwind"
    > solocitada por el inicio de sesion.

    Hola:

    El código que estás intentando ejecutar es el que aparece en mi artículo: Cómo buscar registros en un control DataGridView.

    Si obtienes ese mensaje de error, lo primero que tienes que hacer es comprobar si en la instancia local de SQL Server existe una base de datos llamado 'Northwind'. Si no existe, tendrás que modificar el parámetro 'Initial Catalog' de la cadena de conexión para indicar el nombre de una base de datos que exista en el servidor de SQL Server.

    Por supuesto, también tendrás que modificar la consulta SQL de selección para que se adapte al esquema de una tabla existente en la base de datos especificada en el parámetro 'Initial Catalog' de la cadena de conexión.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    martes, 27 de septiembre de 2011 10:35
  • Hola

    Gracias spor responder .

    Si tengo una base de datos que se llama Northwind y es la que utilizo, pero dentro de el sql server creo que no esta , esta base de datos Northwind la descarge de internet de nose donde , creo que era algo de un archivo scleme.dll o algo parecido.

     

    como puedo mirar la base de datos que se supone que estoy utilizando??

     


    davidd88
    martes, 27 de septiembre de 2011 21:08
  • Hola jcuroca !!

    E intentado lo que me dices pero no lo e conseguiedo.

    donde pone entre comillas dobles, rojas y mayusculas:

    TU CADENA DE CONEXION

    TU TABLA

    TU CAMPO

    Ahi yo lo e modificado por lo que creo que es mi cadena de conexion ;

    mi tabla que es northwinddataset.customers

    tu campo que es id_customers

     

    Creo que aqui esta el fallo.

     

    Sabes si algo de esto no es correcto?? y como lo podria modificar??

     

    Un saludo.


    davidd88
    martes, 27 de septiembre de 2011 21:14
  • pero cuando descargaste tenias un archivo .mdf ?

    si lo tienes no has probado conectarte al sql server con el sql server management studio y adjuntar la db

    imagen

    si haces esto podras conectarte por medio del nombre como lo tienes definido en el connection string

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 27 de septiembre de 2011 21:18
  • Hola.

    Es un placer .

    Gracias por contestar .

    Intentare hacer algo haver que consigo, pero el problema pricipal es que no se progamacion, y todas las cosas que me dices no se como se hacen , por ejemplo el parametro 'Initial Catalog' no se como modificarlo, si lo consiguiese no sabria como escojer otro de sql server , tampoco sabria modifcar la consulta sql.

    Vamos que no se nada de nada.

    Pero estoy muy agradecido  de todas formas.

    Yo lo intento haver por donde sale la cosa.

    Un saludo.


    davidd88
    martes, 27 de septiembre de 2011 21:23
  • Buenas.

    No, no tenia ningun archivo .mdf.

    Tampoco tengo el sql server management studio.

    Tengo el sql server 2008 express.

    si me descargo el  sql server management studio podre intentarlo??

    Un saludo


    davidd88
    martes, 27 de septiembre de 2011 21:34
  • No, no tenia ningun archivo .mdf.

    pero entonces no entiendo, sino tienes un mdf o base implementada como es que piensas conectarte ?

     

    Tampoco tengo el sql server management studio.Tengo el sql server 2008 express.

    si tienes la version express que descargas de aqui

    http://www.microsoft.com/sqlserver/en/us/editions/express.aspx

    esta incluye el sql server management studio para administrar el servicio de sql server

     

    si me descargo el  sql server management studio podre intentarlo??

    seguramente, yo lo uso y es asi como adjunto la db al servicio de sql server

    eso si primero consigue la base de datos

     

    saludos

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 28 de septiembre de 2011 4:02
  • Hola nuevamente, mira yo antes usaba esa base de datos la tengo en mi correo y levantaba ael scrip a la SQL luego seleccionaba todo y lo corria con un famoso f5 esperaba 20 segundos y ya estaba, luego justo a la izquierda de Executar seleccioaba la base de datos nortwinner y listo arrancaba normal.

    por lo que recuerdo la TABLA ES CUSTOMER NO NORTHWINNER.CUSTOMER, y si el campo es id_customer, modifica eso quisa sea eso nada mas, y bueno si no pasate e codigo con el error, quisa te pueda hechar una ayuda....

    miércoles, 28 de septiembre de 2011 13:58
  • Buenas .

    Tengo la base northwind que uso para conectarme.

    Tambien tengo el sql server 2008 express con un administrador , pero no aparece nada de  sql server management studio .

    Voy a intentar descargarmelo a ver.

    Un saludo.


    davidd88
    miércoles, 28 de septiembre de 2011 17:16
  • Hola jcuroca !!

    E modificado lo que me dijiste y me sigue saliendo el mismo error.

    Cuando depuro, la base de datos carga la tabla, pero cuando le doy a el button para buscar a los veinte segundos me sale el siguiente mensaje:

    Error relacionado con la red o especifico de la instancia mientras se establecia una conexion con el servidor SQL Server. No se encontro el servidor o este no estaba accesible. Compruebe que el nombre de la instancia es correcto y que SQL Server esta configurado para admitir conexiones remotas.(provider: Interfaces de red SQL, error: 26 - Error al buscar el servidor o instancia especificado)

     

    Esto no se si sera porque la cadena de conexion esta mal puesta o que tengo que configurar el SQL.

    Se que tengo un administrador de configuracion  de SQL Server pero no se donde tocar para cambiar lo de las conexiones.

    Sabes algo de como configurar SQL para que admita conexiones remotas??

    Un saludo

     


    davidd88
    miércoles, 28 de septiembre de 2011 17:41
  • E conseguido qe ya no me aparezca el error: 26.

    Ahora lo que me aparece cuando le doy al button tenga o no puesto algo en el texbox es el siguiente:

    La logitud  del valor para la clave 'data source' supera su limite de '128'.

    Sabes que pasa?? y como puedo solucionarlo??

    Un saludo.


    davidd88
    miércoles, 28 de septiembre de 2011 18:00