.net - software - Pesquisando valores por meio de uma visualização de dados



software para análise de dados quantitativos (1)

Você está seguindo seu próprio caminho criando New Objetos de BD várias vezes. Se o DataAdapter fosse uma variável de nível de formulário, você teria que escrever muito 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)"

Estes são apenas declarados, não há nenhuma instância deles (não New ). Mas onde eles são declarados determina o Scope . Eles estarão por perto até que o formulário seja fechado (ou você os sobrescreve com Dim e / ou New ). Carga de formulário:

' 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

O DataAdapter precisa de um objeto de conexão para funcionar, mas como o comentário menciona em vez de criar explicitamente um, o conector pode criar o seu próprio. Ele será aberto e fechado conforme necessário. O mesmo vale para o SelectCommand - ele criará o seu próprio a partir da instrução SQL SELECT passada.

Observe que é melhor especificar cada coluna na ordem em que você deseja que as colunas apareçam na DataTable . O importante é que, no final, o DataAdapter saiba como excluir, inserir e atualizar linhas. Contanto que você não o destrua ou substitua, você não precisará escrever nenhum SQL para adicionar ou alterar linhas!

Na maioria dos casos, o DataTable é usado como o DataSource para um DGV:

myDGV.DataSource = myDT 

O DGV criará as colunas necessárias e mostrará os dados como linhas. À medida que o usuário digita nas células, essas alterações são refletidas no DataTable portanto, não há necessidade de qualquer código para recuperá-lo.

Nos casos em que o usuário edita dados no DataGridView , isso é tudo o que você precisa para enviar as alterações de volta ao banco de dados:

myDa.Update(myDT)

Neste caso , com base em questões anteriores, os dados são originários de controles de texto, e não da DGV. Assim:

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

Nós "ensinamos" o DataAdapter como atualizar uma linha no carregamento do formulário, de modo que atualizar o banco de dados (uma vez que os dados estão no DT) é uma linha de código: myDA.Update(myDT) .

A DataTable rastreia se cada linha é nova, alterada ou até excluída, então myDA.Update(myDT) toma a ação apropriada para cada uma. Se o sistema for multiusuário, você poderá selecionar as alterações feitas por outros usuários:

myDa.Fill(myDT)

Pesquisando também é simples:

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

Para remover o filtro:

myStudentsDataView = myDT.DefaultView

Se / quando seu DataAdapter falhar em adicionar, inserir, atualizar ou excluir, significa que você criou um New algum lugar. Não faça isso. Da mesma forma, o myDataView mostrará o que estiver em myDT até você criar um novo DT ou DV ou alterar o RowFilter .

Eu estou tentando procurar um valor específico em um banco de dados, inserindo o texto em uma caixa de texto e, em seguida, usando o SQL para consultar o banco de dados e exibir os resultados no datagridview.

aqui está o 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

a chamada para ShowItems () atualiza o datagridview aqui é o código para isso

 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

no momento, quando tento procurar nada acontece e o conteúdo da datagridview permanece como sempre. Eu fino pode ter algo a ver com o meu XML literal da consulta SQL, mas não consigo descobrir isso.

Desde já, obrigado.