Grundkurs Datanbank Programmierung

    • VB.NET

    Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

      Grundkurs Datanbank Programmierung

      Beitrag
      Ich wollte hier mal einen "Grundkurs" für Datenbank Programmierung erstellen, weil ich im Form das nicht mehr sehen kann, wie teils der Code Aufgebaut ist.
      Also fangen wir mal mit der Datenbank Programmierung für Access an. Später, falls erwünscht, erstelle ich noch ein Tutorial für MySQL.

      Die MySQL.Data.dll muss Importiert sein.

      1. Deklarationen
      Als erstes erstellen wir ein Modul. Ist für größere Projekte besser, weil man sonst immer alles in jedem Form neu deklarieren muss.

      VB.NET-Quellcode

      1. Imports System.Data.OleDb
      2. Public con As New OleDb.OleDbConnection
      3. Public cmd As New OleDb.OleDbCommand
      4. Public reader As OleDb.OleDbDataReader
      5. Public anzahl As Integer




      2. Provider
      Dann muss das Programm noch wissen, mit welcher Datenbank sie sich verbinden soll.

      VB.NET-Quellcode

      1. Public Sub Provider()
      2. con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Pfad_zur_datenbank;"
      3. cmd.Connection = con
      4. End Sub




      3. DataGridView
      Falls Ihr eine DataGridView mit den Datanbank Informationen füllen wollt braucht Ihr diesen Code

      VB.NET-Quellcode

      1. Dim ds As New DataSet
      2. Dim dt As New DataTable
      3. Dim da As OleDbDataAdapter
      4. Dim bs As New BindingSource
      5. Public Sub DGV_sehen(ByVal DGV As DataGridView)
      6. dt.Clear()
      7. Provider()
      8. ds.Tables.Add(New DataTable)
      9. da = New OleDbDataAdapter("select * from Tabelle", con) 'Hier ist das wesentliche. Mit dem * sagen wir dem Programm, das wir alle Spalten der Tabelle laden möchte. Tabelle muss man eben durch den richtigen Tabellennamen ersetzen.
      10. da.Fill(dt)
      11. Dim cb As New OleDbCommandBuilder(da)
      12. bs.DataSource = dt
      13. DGV.DataSource = bs
      14. End Sub




      Allgemein:
      Hier man ein Stopp. Ich arbeite mit einer Datenbank mit einer Tabelle (Benutzer) und folgende Spalten in der Tabelle (Name, Alter, EMail, ID). ID sollte in jeder Tabelle forhanden sein, weil ohne die kann man schlecht Einträge in die Datenbank hinzufügen, bearbeiten und löschen. Und Die Spalte hat immer den Primärindex und das Extra, das sie immer automatisch erhöht wird.

      DB = Datenbank

      Kommen wir nun zum eher Schwierigem Teil

      4. Hinzufügen eines Eintrags

      VB.NET-Quellcode

      1. If txt_name.Text = "" Or txt_alter.Text = "" Or txt_email.Text = "" Then
      2. msgbox("Füllen Sie alle Felder aus!")
      3. Else
      4. Try
      5. con.Open() 'Verbindung zur Db öffnen
      6. cmd.CommandText = "INSERT INTO Benutzer(Name, Alter, EMail) VALUES ('" & txt_name.text & "', '" & txt_alter.text & "', '" & txt_name.Text & "')" 'Der Befehl für die DB
      7. anzahl = cmd.ExecuteNonQuery 'anzahl enthält nun ein Wert alle geänderten/ hinzugefügten/ gelöschten Einträge
      8. con.close 'Verbindung zur DB schließen
      9. If anzahl > 0 Then 'Nun wird kontrolliert ob überhaupt ein Eintrag hinzugefügt geworden ist, wenn ja dann die MSG
      10. MsgBox("Sie haben einen Eintrag gemacht", MsgBoxStyle.Information)
      11. End If
      12. Catch ex As Exception
      13. con.close 'ich schließe hier ebenfalls die Verbindung, weil wenn ein Fehler in dem oberen code passiert, passiert er vor dem schließen der Verbindung. Wenn ich das nicht machen würde käme der Fehler das die Verbindung noch offen ist, wenn ich das nächste mal eine Verbindung öffne.
      14. MsgBox(ex.Message)
      15. End Try
      16. End If




      Der Befehl zum Hinzufügen von Einträgen ist also so aufgebaut
      insert into Tabelle (Alle Spalten) values (werte der Spalten)

      Eine String muss zwischen Hochkommas stehen '', Zahlen nicht.

      Die Verbindung kann man auch erst später schließen, würde ich aber nicht machen (habe es vor kurzen immer erst nach der IF Abrfage gemacht), weil sonst es Probleme geben kann, wenn man in einem Timer auch einen DB Abfrage hat. Da kommt dann ein Fehler das man die DB Verbindung zuert schließen muss, diese übergehen wir, das wir die Verbindung schnellst möglich wieder schließen, deswegen vor der MSG, weil der User des Programmes, zulange braucht um die MSG weg zu klicken.

      5. Bearbeiten

      VB.NET-Quellcode

      1. If txt_name.Text = "" Or txt_alter.Text = "" Or txt_email.Text = "" Then
      2. msgbox("Füllen Sie alle Felder aus!")
      3. Else
      4. Try
      5. con.Open()
      6. cmd.CommandText = "UPDATE Benutzer SET Name = '" & txt_name.text & "', Alter = '" & txt_alter.text & "', EMail = '" & txt_name.Text & "' where ID = 0"
      7. anzahl = cmd.ExecuteNonQuery
      8. con.close
      9. If anzahl > 0 Then
      10. MsgBox("Sie haben einen Eintrag bearbeitet", MsgBoxStyle.Information)
      11. End If
      12. Catch ex As Exception
      13. con.close
      14. MsgBox(ex.Message)
      15. End Try
      16. End If


      Es ändert sich hier nur der CommandText. Struktur:
      update Tabelle_name set spalte = 'wert'

      6. Löschen
      Hier ist der Restliche Code auch wieder gleich, eben außer der CommandText und die 1. If abfrage, die kann hier weg.

      VB.NET-Quellcode

      1. cmd.CommandText = "delete from Benutzer where ID = 0"



      Hier wird er Eintrag gelöscht, der die ID 0 hat.

      Struktur:
      delete from Tabellen_name


      7. Auslesen
      Jetzt kommen wir zum wichtigstem Thema, das Auslesen der Datenbank. Wir haben weiter oben schon das auslesen in eine Datagridview behandelt, aber noch nicht in Textboxen oder in eine Listbox.

      7.1 Textbox

      VB.NET-Quellcode

      1. Try
      2. con.Open()
      3. cmd.CommandText = "SELECT * FROM Benutzer WHERE ID = 0"
      4. reader = cmd.ExecuteReader
      5. Do While reader.Read
      6. txt_name.text = reader("Name")
      7. txt_alter.text = reader("Alter")
      8. txt_email.text = reader("EMail")
      9. Loop
      10. reader.Close()
      11. con.close
      12. Catch ex As Exception
      13. con.close
      14. MsgBox(ex.Message)
      15. End Try


      Hier kommt noch der "Reader" hinzu.
      Als erstes "verkürzen" wir den aktuellen Reader (cmd.ExecuteReader in reader). Danach starten wir eine do while schleife diese läuft solange bis alle Einträge der DB abgearbeitet sind. In der schleife ändern wir den Text der einzelnen Textboxen.
      Hier brauchen wir noch einen "where" Befehle, weil sonst die Textboxen nur den letzten Eintrag in der Datenbank enthalten. So enthalten Sie den Wert von dem Eintrag mit der ID 0.
      Struktur:
      reader("Spalten_name")

      Der rest ist wieder klar. Reader schließen und DB Verbindung schließen.

      7.2 Listbox

      VB.NET-Quellcode

      1. Try
      2. con.Open()
      3. cmd.CommandText = "SELECT * FROM Benutzer"
      4. reader = cmd.ExecuteReader
      5. lb_benutzer.itesm.clear()
      6. Do While reader.Read
      7. lb_benutzer.items.add(reader("Name"))
      8. Loop
      9. reader.Close()
      10. con.close
      11. Catch ex As Exception
      12. con.close
      13. MsgBox(ex.Message)
      14. End Try


      Hier ändert sich nicht wirklich viel. Wir brauchen hier kein "where" Befehl, weil wir alle benutzer angezeigt haben wollen.
      In der Schleife fügen wir immer die ganzen Namen der User hinzu.

      8. ID auslesen
      Manche haben sich vielleicht schon gefragt, wie ich die Id des Eintrags rausbekomme, den ich bearbeiten bzw. löschen möchte.

      VB.NET-Quellcode

      1. dim ID as new List(of String)
      2. Try
      3. con.Open()
      4. cmd.CommandText = "SELECT ID FROM Benutzer"
      5. reader = cmd.ExecuteReader
      6. ID.Clear()
      7. Do While reader.Read
      8. ID.Add(reader("ID"))
      9. Loop
      10. reader.Close()
      11. Catch ex As Exception
      12. con.close
      13. MsgBox(ex.Message)
      14. End Try

      als erstes laden wir alle IDs in eine Liste.
      nun kann man ganz leicht die entsprechende id abfragen. z.B. mit einer Listbox:

      VB.NET-Quellcode

      1. cmd.CommandText = "delete from Benutzer where ID = " & ID(lb_benutzer.selectedindex)


      Nun würde das Programm den Eintrag löschen, der in der Listbox ausgewählt wurde.



      Hier komme ich mal zum Ende. Ich hoffe, dass ich nicht so viele Rechtschreibfehler eingebaut habe, wenn doch nimmt es mit nicht übel.

      Falls Interesse an einem MySQL Tutorial besteht, dann meldet auch bitte bei mir.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Chris213“ () aus folgendem Grund: Verbessern

      Hi Chris123,

      ein guter Anfang, aber hier noch ein paar Hinweis:

      Generell solltest Du die Schlüsselworte für SQL groß schreiben, das erleichtert, insbesondere Anfängern, das Lesen und Verstehen des Codes.

      zu 3. Du sollest noch erläutern, warum Du die BindingSource verwendest, denn es geht auch ohne.
      zu 4. Das Schließen der Datenbank sollte entweder außerhalb des Try-Block oder in einem Finally stehen, damit die Verbindung auch im Fehlerfall geschlossen wird.
      zu 7.1 Warum nutzt Du die Do-Schleife, wenn Du nur einen Datensatz auslesen willst.
      zu 7.2 Warum musst Du umständlich alles zeilenweise auszulesen? Sinnvoller wäre es alles in eine Tabelle lesen (siehe 3) und diese dann an die Listbox binden. Dann hast Du auch nicht das Problem mit der ID in 8
      NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).

      Chris213 schrieb:

      Nein mit dem * liest du alle Spalten aus

      Wirklich? ;)
      In deinem Beispiel-Code willst du die IDs lesen, benutzt aber SELECT * statt SELECT ID ...
      Sowas ist ziemlich ineffizient und sollte in einen "Tutorial" IMHO nicht auftauchen!
      Außerdem sollte man IMHO gleich mit DBParametern arbeiten, weil man so diverse Konvertierungsprobleme etc umgeht, bzw in den Treiber auslagert (und der weiß es am besten)

      INOPIAE schrieb:

      Hi Chris123,

      ein guter Anfang, aber hier noch ein paar Hinweis:

      Generell solltest Du die Schlüsselworte für SQL groß schreiben, das erleichtert, insbesondere Anfängern, das Lesen und Verstehen des Codes.

      zu 3. Du sollest noch erläutern, warum Du die BindingSource verwendest, denn es geht auch ohne.
      zu 4. Das Schließen der Datenbank sollte entweder außerhalb des Try-Block oder in einem Finally stehen, damit die Verbindung auch im Fehlerfall geschlossen wird.
      zu 7.1 Warum nutzt Du die Do-Schleife, wenn Du nur einen Datensatz auslesen willst.
      zu 7.2 Warum musst Du umständlich alles zeilenweise auszulesen? Sinnvoller wäre es alles in eine Tabelle lesen (siehe 3) und diese dann an die Listbox binden. Dann hast Du auch nicht das Problem mit der ID in 8


      Das mit dem Groß schreiben merk ich mir, ich machst halt immer klein :D
      Den rest werde ich später auch noch ergänzen, danke für dein tipps
      Das schießen der Verbindung außerhalb bringt eben so Fehler, habe hier leider immer das con.close in dem Catch Teil vergessen.

      picoflop schrieb:

      Chris213 schrieb:

      Nein mit dem * liest du alle Spalten aus

      Wirklich? ;)
      In deinem Beispiel-Code willst du die IDs lesen, benutzt aber SELECT * statt SELECT ID ...
      Sowas ist ziemlich ineffizient und sollte in einen "Tutorial" IMHO nicht auftauchen!
      Außerdem sollte man IMHO gleich mit DBParametern arbeiten, weil man so diverse Konvertierungsprobleme etc umgeht, bzw in den Treiber auslagert (und der weiß es am besten)


      Ich lese eigendlich immer alle Spalten aus, ist oftmals einfacher, als die Spalten aufzulisten. Jedoch hast du vollkommen Recht, das macht das Programm langsamer und sollte bei nur einer Spalte nicht verwendet werden. :D
      Wie importiere ich die MySQL.Data.dll ?? und vor allem wo bekomme ich die her?

      P.S.: Oben steht das Tut is für MS Access aber mir wurde es für MySQl empfohlen.. ?( ?(

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FS-DU“ ()

      Die Mysql.Data.dll hänge ich dir mal an.

      Für Mysql musst du nur die Deklarationen von con, cmd, reader ändern und den Provider musst du ändern.
      anstatt das

      VB.NET-Quellcode

      1. Imports System.Data.OleDb
      2. Public con As New OleDb.OleDbConnection
      3. Public cmd As New OleDb.OleDbCommand
      4. Public reader As OleDb.OleDbDataReader
      5. Public Sub Provider()
      6. con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Pfad_zur_datenbank;"
      7. cmd.Connection = con
      8. End Sub

      schreibst du das

      VB.NET-Quellcode

      1. Imports MySql.Data.MySqlClient
      2. Public con As New MySqlConnection
      3. Public cmd As New MySqlCommand
      4. Public reader As MySqlDataReader
      5. Public Sub Provider()
      6. con.ConnectionString = "server=ip_des_servers;user id=Benutzer_name;password=passwort;database=Datenbank_name;"
      7. cmd.Connection = con
      8. End Sub


      Einen Verweis auf die Mysql.Data.dll machst du so:
      - Entpacke die DLL
      - Füge die DLL in den Ordner \Projekt_name\bin\Debug\ ein, sodass es eine Probleme beim veröffentlichen deines Projektes gibt
      - öffne dein Projekt
      - Klicke mit der rechten Maustaste auf dein Projektname im Projekt-Explorer.
      - Klicke nun auf Verweis hinzufügen
      - Gehe auf den Reiter "Durchsuchen"
      - öffne den Verzeichnis "bin"
      - dann "Debug"
      - wähle nun die Mysql.Data.dll aus und klicke auf OK
      - Fertig

      Ich hoffe ich konnte dir helfen.
      Dateien
      • MySql.Data.rar

        (104,5 kB, 565 mal heruntergeladen, zuletzt: )
      Danke für die Antwort,
      hier ist der Code:

      VB.NET-Quellcode

      1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      2. If txt_vname.Text = "" Or txt_nname.Text = "" Or txt_strasse.Text = "" Or txt_hnummer.Text = "" Or txt_plz.Text = "" Or txt_ort.Text = "" Or txt_telnummer.Text = "" Or txt_kundennummer.Text = "" Then
      3. MsgBox("Füllen Sie die markierten Felder aus!")
      4. Else
      5. 'Try
      6. con.Open()
      7. cmd.CommandText = "UPDATE Kunden SET Name = '" & txt_vname.Text & "','" & txt_nname.Text & "','" & txt_strasse.Text & "','" & txt_hnummer.Text & "','" & txt_plz.Text & "','" & txt_ort.Text & "','" & txt_telnummer.Text & "','" & txt_telnummer2.Text & "','" & txt_handynummer.Text & "','" & txt_kundennummer.Text & "','" & gebdatum.Value & "' where ID = " & ID
      8. anzahl = cmd.ExecuteNonQuery
      9. con.Close()
      10. If anzahl > 0 Then
      11. MsgBox("Sie haben einen Kunden bearbeitet", MsgBoxStyle.Information)
      12. End If
      13. 'Catch ex As Exception
      14. 'con.Close()
      15. 'MsgBox(ex.Message)
      16. 'End Try
      17. End If
      18. End Sub
      "UPDATE Kunden SET Name = '" & txt_vname.Text & "','" & txt_nname.Text & "','" & txt_strasse.Text

      Quellcode

      1. "UPDATE Kunden SET Name = '" & txt_vname.Text & "',' nachname=" & txt_nname.Text & "',' strasse=" & txt_strasse.Text

      natürlich fortsetzen und deine entsprechenden Bezeichnungen eintragen, aber so wie du es oben hast, weiß MySQL nicht, wo es denn was eintragen soll...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      Du sagst der Datenbank:
      Ich möchte EIN Feld updaten. Nämlich Name. Aber du übergibst mehr als einen Wert (die durch Kommas getrennt werden)
      Es müsste also heißen:
      UPDATE Tabelle SET Name='Wutz', Vorname='Willi', Ort='Posemuckel' WHERE ID=42
      Bei mir kommt dieser Fehler:



      SQL-Abfrage

      1. DROP TABLE IF EXISTS `benutzer`;
      2. CREATE TABLE `benutzer` (
      3. `Benutzername` int(5) NOT NULL auto_increment,
      4. `Passwort` varchar(255) default NULL,
      5. `Email` varchar(255) default NULL,
      6. PRIMARY KEY (`ID`)
      7. ) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;


      VB.NET-Quellcode

      1. Public con As New MySqlConnection
      2. Public cmd As New MySqlCommand
      3. Public reader As MySqlDataReader
      4. Public Sub Provider()
      5. con.ConnectionString = "server=***;user id=***;password=***;database=***"
      6. cmd.Connection = con
      7. End Sub
      8. Try
      9. con.Open()
      10. cmd.CommandText = "SELECT * FROM benutzer WHERE Benutzername = " & TextBox1.Text
      11. reader = cmd.ExecuteReader
      12. Do While reader.Read
      13. recht = reader("Recht")
      14. Loop
      15. reader.Close()
      16. con.Close()
      17. Catch ex As Exception
      18. con.Close()
      19. MsgBox(ex.Message)
      20. End Try



      was mach ich falsch??

      MfG
      IMO behindert man sich mit diesem Tut mehr, als dasses einem nützen kann.
      Wer wird denn ernsthaft mit DataReader und DBCommand einzelne Datensätze lesen und schreiben wollen, wenn man mit einem DataAdapter ganze Dataset-Tabellen mit einem Befehl befüllt und mit einem(!) anderen Befehl alle Änderungen synchronisiert (D.h. Insert, Delete und Update-Command für alle vom User angefassten Datensätze korrekt aufrufen)
      ?