Проблема с Windows База данных формы и доступа - PullRequest
0 голосов
/ 21 января 2020

Первый пост здесь. Я на самом деле новичок в мире программирования, и то, что я спрашиваю, может показаться глупым для многих из вас.
В любом случае я пытаюсь создать форму, которая будет искать в базе данных имя, которое вы ищете, показывая список информации об этом человеке.

Проблема возникает, когда в базе данных есть несколько человек с таким именем: в этом случае в форме отображается только один из них. Я хотел добавить кнопку, чтобы перейти к следующему результату, но вот где я застрял.

Я искал в Интернете похожие проблемы, но не смог их найти.

Вот мой код, надеюсь, кто-нибудь может мне помочь
(пожалуйста, имейте в виду, что я новичок и пока не очень разбираюсь в программировании). Форма 1 :

Private Sub BtnCerca_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles btnCerca.Click
    Dim trova As Boolean

    Try
        cm = New OleDb.OleDbCommand
        With cm
            .Connection = cn
            .CommandType = CommandType.Text
            .CommandText = "SELECT * FROM persone WHERE nome = '" & txtSearch.Text & "' OR cognome = '" & txtSearch.Text & "'"
            dr = .ExecuteReader
        End With
        While dr.Read()
            txtId.Text = dr("id_persone").ToString
            txtNome.Text = dr("nome").ToString
            txtCognome.Text = dr("cognome").ToString
            txtDate.Text = dr("data_nascita").ToString
            txtNascita.Text = dr("luogo_nascita").ToString
            txtResidenza.Text = dr("luogo_residenza").ToString
            trova = True
        End While

        If trova = False Then Dim unused = MsgBox("UTENTE NON TROVATO!", MsgBoxStyle.Critical)
        dr.Close()
    Catch ex As Exception

    End Try
    Exit Sub
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Call Connection()
End Sub

Private Sub BtnReset_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnReset.Click
    ClearTextFields(Me)
End Sub

Public Sub ClearTextFields(ByVal parent As Control)
    For Each ctl As Control In parent.Controls
        If TypeOf ctl Is TextBox Then
            If ctl.Text.Trim() <> String.Empty Then
                ctl.Text = String.Empty
            End If
        End If
    Next
    End Sub
End Class

Модуль :

Imports System.Data.OleDb

Module modConnection
    Public cn As New OleDb.OleDbConnection
    Public cm As New OleDb.OleDbCommand
    Public dr As OleDbDataReader

    Public Sub Connection()
        cn = New OleDb.OleDbConnection
        With cn
            .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\dati_persone.mdb"
            .Open()
        End With
    End Sub
End Module

1 Ответ

0 голосов
/ 22 января 2020

В представлении дизайна формы перетащите BindingNavigator на форму. Вы найдете это в панели инструментов под узлом данных. Вы можете удалить кнопку «+» и кнопку «X», щелкнув правой кнопкой мыши и выбрав «Удалить» в контекстном меню.

Мы будем использовать DataTable, поскольку его можно использовать как DataSource для BindingSource.

Храните ваши объекты данных локально относительно метода, в котором они используются, чтобы вы могли быть уверены, что они закрыты и удалены. Блок Using позаботится об этом за вас. Блок Using здесь включает в себя как соединение, так и команду.

Всегда используйте параметры, чтобы избежать sql внедрения, которое может повредить вашу базу данных.

Создайте BindingSource и установите его DataSource до DataTable. Затем установите BindingSource свойство BindingNavigator, которое вы добавили в форму. Затем добавьте DataBindings к каждому из ваших текстовых полей. Метод .Add принимает имя свойства для привязки, BindingSource и имя поля.

Это должно сделать это.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim dt As New DataTable
    Try
        Using cn As New OleDbConnection("your connection string"),
                cmd As New OleDbCommand("Select * From persone Where nome = @nome Or cognome = @cognome;", cn)
            cmd.Parameters.Add("@nome", OleDbType.VarChar).Value = txtSearch.Text
            cmd.Parameters.Add("@cognome", OleDbType.VarChar).Value = txtSearch.Text
            cn.Open()
            dt.Load(cmd.ExecuteReader)
        End Using
        Dim BdS As New BindingSource
        BdS.DataSource = dt
        BindingNavigator1.BindingSource = BdS
        txtId.DataBindings.Add("Text", BdS, "id_persone")
        txtNome.DataBindings.Add("Text", BdS, "nome")
        txtCognome.DataBindings.Add("Text", BdS, "cognome")
        txtDate.DataBindings.Add("Text", BdS, "data_nascita")
        txtNascita.DataBindings.Add("Text", BdS, "luogo_nascita")
        txtResidenza.DataBindings.Add("Text", BdS, "luogo_residenza")
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub
...