Suchfunktion - Visual Basic - mit Datenbankzugriff

Jessica_R

Newbie
Registriert
Mai 2019
Beiträge
6
Hallo zusammen,

ich versuche gerade eine Suchfunktion mittels Datenbankzugriff zu realisieren.

In der Datenbank gibt es eine Tabelle mit Prüflingen, jeder Prüfling hat eine Prüflingsnummer.
In der Visual Basic Form gibt es Textfelder für Prüflingsnummer, Name, Beruf etc.
Bei Eingabe der Prüflingsnummer sollen die Restlichen Felder über die Datenbank gefüllt werden.

Leider kommen hier immer wieder verschiedene Fehlermeldungen.

Habe den Code schon ein paar mal umgeschrieben und immer klappt es nicht.

Das hier ist der Code des "Buttons" (ich nutze hier ein Bild als Button)

Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PB_btn_SucheNachPrüfling.Click

con = New OleDbConnection
con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Acer\Desktop\IHK\IHK-Bewertung\ITAPIHK2018.accdb;
Persist Security Info=False;"

Dim Reader As OleDbDataReader
Dim Command As OleDbCommand

Try
con.Open()

Dim Query As String =
"SELECT * FROM tbl_prueflingedaten where nr='" & (CInt(txtPrüflingsnummer.Text)) & "'"

Command = New OleDbCommand(Query, con)
Reader = Command.ExecuteReader

While Reader.Read
txtvorname.Text = Reader("vorname").ToString
txtnachname.Text = Reader("Nachname").ToString
txtBeruf.Text = Reader("Beruf").ToString
End While

con.Close()

Catch ex As Exception

MessageBox.Show(ex.Message)

Finally

con.Dispose()

End Try

End Sub

Ach ja bitte zerreist mich nicht, bin noch recht am Anfang vom Programmieren lernen.
Und hab mir bisschen etwas aus dem Internet zusammengebastelt...

Ich verstehe zwar mittlerweile auch den Code, aber wirklich klappen tut es nicht.
 
Kannst du den Quellcode bitte in die dafür vorgesehen Code Tags setzen? Dann liest es sich einfacher und die Formatierung bleibt erhalten.


Was genau klappt denn nicht? Kommt da eine Fehlermeldung? Hast du den Code mal im Debug-Modus durchlaufen lassen?


Ein grundsätzliches Thema im Umgang mit SQL und Strings möchte ich übrigens ansprechen: SQL-Strings mit einfachen Verknüpfungen zusammenzubasteln öffnet Tür und Tor für SQL-Injection. Im vorliegenden Beispiel wird der Inhalt des Textfelds "txtPrüflingsnummer" zwar in eine Zahl gecastet, aber wenn du ein weiteres Feld zum Filtern nutzt wo beispielsweise nach Nachname gefiltert werden kann, würdest du das ja vermutlich genauso tun? Wenn ja, hoffe ich für dich, dass niemand auf die Idee kommt, nach dem Nachnamen "'bla'; DROP ALL TABLES;" sucht ;)

Zu diesem Zwecke gibt es parametrisierte Queries. Die sehen dann üblicherweise so aus (in diesem Falle C#):

Code:
string query = "SELECT * FROM tbl_prueflingedaten WHERE Nachname=@nachname";
OleDbCommand cmd = New OleDbCommand(query, con);
cmd.Parameters.AddWithValue("@nachname", txtNachname.Text);
 
Ich hoffe das mit dem Code stimmt so.

Es kommt diese Fehlermeldung:
796329


Im direktfenster kommt zusätzlich diese Meldung:
"Ausnahme ausgelöst: "System.Data.OleDb.OleDbException" in System.Data.dll"

Das Thema SQL - Injection steht bei mir momentan nicht so weit vorne in der Prioritätenliste, da das Programm nur als Übung dient und nie veröffentlicht / genutzt werden soll.

Danke schon mal für die Hilfe.


Code:
Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PB_btn_SucheNachPrüfling.Click

        con = New OleDbConnection
        con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Acer\Desktop\IHK\IHK-Bewertung\ITAPIHK2018.accdb;
        Persist Security Info=False;"

        Dim Reader As OleDbDataReader
        Dim Command As OleDbCommand

        Try

            con.Open()

            Dim Query As String =
           "SELECT * FROM tbl_prueflingedaten where nr='" & (CInt(txtPrüflingsnummer.Text)) & "'"

            Command = New OleDbCommand(Query, con)
            Reader = Command.ExecuteReader

            While Reader.Read
                txtvorname.Text = Reader("vorname").ToString
                txtnachname.Text = Reader("Nachname").ToString
                txtBeruf.Text = Reader("Beruf").ToString
            End While

            con.Close()

        Catch ex As Exception

            MessageBox.Show(ex.Message)

        Finally

            con.Dispose()

        End Try

    End Sub
Ergänzung ()

Ich hoffe das mit dem Code stimmt so.

Es kommt diese Fehlermeldung:
796329


Im direktfenster kommt zusätzlich diese Meldung:
"Ausnahme ausgelöst: "System.Data.OleDb.OleDbException" in System.Data.dll"

Das Thema SQL - Injection steht bei mir momentan nicht so weit vorne in der Prioritätenliste, da das Programm nur als Übung dient und nie veröffentlicht / genutzt werden soll.

Danke schon mal für die Hilfe.


Code:
Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PB_btn_SucheNachPrüfling.Click

        con = New OleDbConnection
        con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Acer\Desktop\IHK\IHK-Bewertung\ITAPIHK2018.accdb;
        Persist Security Info=False;"

        Dim Reader As OleDbDataReader
        Dim Command As OleDbCommand

        Try

            con.Open()

            Dim Query As String =
           "SELECT * FROM tbl_prueflingedaten where nr='" & (CInt(txtPrüflingsnummer.Text)) & "'"

            Command = New OleDbCommand(Query, con)
            Reader = Command.ExecuteReader

            While Reader.Read
                txtvorname.Text = Reader("vorname").ToString
                txtnachname.Text = Reader("Nachname").ToString
                txtBeruf.Text = Reader("Beruf").ToString
            End While

            con.Close()

        Catch ex As Exception

            MessageBox.Show(ex.Message)

        Finally

            con.Dispose()

        End Try

    End Sub
 
Denkbar wäre zum Beispiel, dass die Prüflingsnummer nr in der Datenbank als Zahl repräsentiert ist, du in deiner Abfrage durch Verwendung der Hochkommata aber gegen eine Zeichenkette prüfst. Wirklich herausfinden wirst du es nur, indem du debuggst und/oder deinen Code mit Ausgaben anreicherst, damit du siehst, wo er genau aussteigt.
 
Stimmt, das wird's sein. Ich hatte übersehen, dass da mit "'" noch die Hochkommata in den String eingebaut werden. Die müssen natürlich weg. Eine Zahl wird als Zahl geprüft und nicht als String. '6' ist nämlich NICHT gleich 6. Wenn überhaupt, wäre '6' eine 54, weil das der ASCII-Code für das Zeichen 6 ist.

Jessica_R schrieb:
Das Thema SQL - Injection steht bei mir momentan nicht so weit vorne in der Prioritätenliste, da das Programm nur als Übung dient und nie veröffentlicht / genutzt werden soll.
Naja, aber gerade wenn es als Übung dienen soll, sollte man es richtig üben. Mit einem paramatrisierten Query schützt man sich nicht nur vor SQL injection, sondern man spart sich auch etwaige Hochkommata, etc., weil der Value implizit in das richtige Format gebracht wird - als String dann inkl. '...' und als Zahl eben ohne. Der Datentyp-Fehler wäre also gar nicht erst aufgetreten und du hättest eine potentielle Sicherheitslücke geschlossen.
 
Zurück
Oben