Búsqueda de valores a través de una vista de tabla de datos

Intento buscar un valor específico en una base de datos ingresando texto en un cuadro de texto y luego usando SQL para consultar la base de datos y luego mostrar los resultados en la vista de tabla de datos.

aquí está el código:

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSearch.TextChanged Connection.Open() Dim dataTable As New DataTable Dim dataSet As New DataSet dataSet.Tables.Add(dataTable) Dim dataAdapter As New OleDbDataAdapter Dim SQLQuery As String SQLQuery =  SELECT * FROM Students WHERE StudentFirstName = @StudentFirstName  .Value dataAdapter = New OleDbDataAdapter(SQLQuery, Connection) dataAdapter.SelectCommand.Parameters.Add("@StudentFirstName", SqlDbType.Text).Value = txtStudentFirstname.Text dataAdapter.Fill(dataTable) dgrStudentDatabaseViewer.DataSource = dataTable.DefaultView ShowItems() Connection.Close() End Sub 

la llamada a ShowItems () actualiza el datagridview aquí está el código para él

  Private Sub ShowItems() ' the following delcleration are used for displaying the contents of the table Dim dataAdapter As New OleDbDataAdapter Dim DataTable As New DataTable Dim DataSet As New DataSet Dim SQLQuery As String = SELECT * FROM Students DataSet.Tables.Add(DataTable) dataAdapter = New OleDbDataAdapter(SQLQuery, Connection) dataAdapter.Fill(DataTable) ' fills the content from the database into the table in vb net dgrStudentDatabaseViewer.DataSource = DataTable.DefaultView Connection.Close() End Sub 

en este momento, cuando bash buscar, no pasa nada y el contenido de la vista de tabla de datos permanece como siempre. Creo que podría tener algo que ver con mi literal XML de la consulta SQL, pero no puedo resolverlo.

Gracias por adelantado.

Se está poniendo en su propio camino al crear New DB Objects una y otra vez. Si DataAdapter fuera una variable de nivel de formulario, tendría que escribir mucho menos código:

 Public Class Form1 ' declare some persistant DB objects Private myDT As DataTable Private myDA As OleDbDataAdapter Private myStudentsDataView As DataView Private dbConnStr As String = "(your connection string)" 

Estos se acaban de declarar, no hay instancia de ellos (no es New ). Pero donde se declaran determina el Scope . Estarán presentes hasta que se cierre el formulario (o los sobrescribes con Dim y / o New ). Carga de formulario:

 ' initialize the objects Dim sql = "SELECT A, B, C, D... FROM Students" ' this is the ONLY place you use NEW ' with these objects myDT = New DataTable() ' The Adapter can create its own Connection ' and SelectCommand myDA = New OleDbDataAdapter(sql, dbConnStr) Dim myCB As New OleDbCommandBuilder(da) ' "teach" the DA how to Update and Add: myDA.UpdateCommand = myCB.GetUpdateCommand myDA.InsertCommand = myCB.GetInsertCommand myDA.DeleteCommand = myCB.GetDeleteCommand myDA.Fill(myDT) myDA.FillSchema(myDT, SchemaType.Source) myStudentsDataView = myDT.DefaultView dgvStudents.DataSource = myStudentsDataView 

El DataAdapter necesita un objeto de conexión para funcionar, pero como el comentario menciona en lugar de crearlo explícitamente, el Adaptador puede crear el suyo propio. Se abrirá y cerrará según lo necesite. Lo mismo es cierto para SelectCommand : creará el suyo a partir de la sentencia SELECT SQL transmitida.

Tenga en cuenta que es mejor especificar cada columna en el orden en que desea que aparezcan las columnas en la DataTable . Lo importante es que al final DataAdapter sepa cómo eliminar, insertar y actualizar filas. ¡Mientras no lo destruya o lo reemplace, no tendrá que escribir ningún SQL para agregar o cambiar filas!

En la mayoría de los casos, DataTable se usa como DataSource para un DGV:

 myDGV.DataSource = myDT 

La DGV creará las columnas necesarias y mostrará los datos como filas. A medida que el usuario escribe en las celdas, esos cambios se reflejan en la DataTable por lo que no es necesario que el código vuelva a pescar.

En los casos en que el usuario edita datos en DataGridView , esto es todo lo que necesita para enviar los cambios a la base de datos:

 myDa.Update(myDT) 

En este caso , en base a preguntas anteriores, los datos se originan a partir de controles de texto en lugar de DGV. Asi que:

 Private Sub AddStudent() ' no need to (RE)create DataAdapter ' add the data to a new row: Dim dr = myDT.NewRow dr.Item("FirstName") = textbox1.text dr.Item("LastName") = textbox2.text ' etc etc ' add the new row to the datatable myDT.Rows.Add(dr) ' with a persistent DA, this is all you need to add a row: myDA.Update(myDT) End Sub 

“Enseñamos” al DataAdapter cómo actualizar una fila en la carga del formulario, por lo que en realidad la actualización de la base de datos (una vez que los datos están en el DT) es una línea de código: myDA.Update(myDT) .

DataTable rastrea si cada fila es nueva, cambiada o incluso eliminada, por lo que myDA.Update(myDT) realiza la acción adecuada para cada una. Si el sistema es multiusuario, puede elegir cambios por otros usuarios:

 myDa.Fill(myDT) 

La búsqueda también es simple:

 Private Sub Search(txt As String) myStudentsDataView.RowFilter = String.Format("LastName = '{0}'", txt) 

Para eliminar el filtro:

 myStudentsDataView = myDT.DefaultView 

Si / cuando su DataAdapter no puede agregar, insertar, actualizar o eliminar significa que creó una New alguna parte. No hagas eso. Del myDataView modo myDataView mostrará todo lo que esté en myDT hasta que cree un nuevo DT o DV o cambie el RowFilter .