.net - ventajas - tipos de vistas en base de datos
Búsqueda de valores a través de una vista de cuadrícula de datos (1)
Te estás metiendo en tu camino creando
New
objetos DB una y otra vez.
Si el
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 ninguna instancia de ellos (no hay
New
).
Pero
donde
se declaran determina el
Scope
.
Estarán disponibles hasta que se cierre el formulario (o los sobrescribas 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 crear uno explícitamente, el Adaptador puede crear el suyo.
Lo abrirá y cerrará según lo necesite.
Lo mismo es cierto para el
SelectCommand
: creará el suyo a partir de la instrucción SELECT SQL aprobada.
Tenga en cuenta que es mejor especificar cada columna en el orden en que desea que las columnas aparezcan en la
DataTable
.
Lo importante es que al final
DataAdapter
sepa cómo eliminar, insertar y actualizar filas.
¡Mientras no lo destruya ni 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
El 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 hay necesidad de ningún código para recuperarlo.
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 , según las preguntas anteriores, los datos se originan a partir de controles de texto en lugar de DGV. Entonces:
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 carga de formulario, por lo que 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, modificada o incluso eliminada, por lo que
myDA.Update(myDT)
toma la acción adecuada para cada una.
Si el sistema es multiusuario, puede recoger los cambios de 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 quitar el filtro:
myStudentsDataView = myDT.DefaultView
Si / cuando su
DataAdapter
no puede agregar, insertar, actualizar o eliminar, significa que creó uno
New
alguna parte.
No hagas eso.
Del
myDataView
modo,
myDataView
mostrará lo que esté en
myDT
hasta que cree un nuevo DT o DV o cambie el
RowFilter
.
Estoy tratando de 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 cuadrícula 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 = <sql>
SELECT *
FROM Students
WHERE StudentFirstName = @StudentFirstName
</sql> .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 la vista de cuadrícula de datos aquí está el código para ello
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 = <sql>SELECT * FROM Students</sql>
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
por el momento, cuando intento buscar nada sucede y el contenido de la vista de cuadrícula de datos permanece como siempre. Creo que podría tener algo que ver con mi literal XML de la consulta SQL, pero no puedo entenderlo.
Gracias por adelantado.