Datenbankprogrammierung Teil 1 (DAO) Verfasst am: 15.06.2009, 11:05
Hallo Leute.
Hab mir mal gedacht ich setze mich wieder an ein Tutorial. Diesmal geht es über das programmieren mit Datenbanken. Das kann ja oft sehr nützlich sein und erleichtert einem auch sehr das Leben.
In diesem Tut werde ich euch zeigen wie man mit einer Access Datenbank und der Schnittstelle „DAO 3.6“ umgeht. Diese Schnittstelle dient uns als Kommunikationsmittel mit der eigentlichen Datenbank.
„DAO“ ist zwar schon älter, wird aber sehr häufig eingesetzt und bei der Geschwindigkeit kann man sehr hohe Werte erreichen.
Ihr müsst euch keine Sorgen machen, dass es zu schwierig wäre mit Datenbanken zu arbeiten. Es ist wirklich sehr einfach und es hat viele Vorteile gegenüber einer .ini bzw. einer .txt Datei oder der Registry.
Und nun erstellen wir eine Datenbank mit dem „Visual Data Manager“ direkt in VB. Wichtig ist, dass ihr eindeutige Namen wählt.
Als Beispiel werde ich hier eine DB erstellen, in der man seine Mail Accounts + Passwort speichern kann.
Als erstes erstellen wir mal die Datenbank auf der Festplatte. Dann machen wir eine Tabelle mit dem Namen „mailaccounts“ und den Spalten „mail“, und „password“. Außerdem wollen wir noch dass den Einträgen der Spalte „mail“ ein Index zugewiesen wird. Das ermöglicht uns eine sehr schnelle Suche der Einträge. Nennt den Index einfach „MailIndex“. http://www.imagebanana.com/img/gckdfcyd/datenbank.gif
Nachdem ihr das gemacht habt, könnt ihr den Visual Data Manager schließen.
2. Datenbank laden/öffnen.
Um eine Datenbank und ihre Tabellen anzusprechen brauchen wir erstmal zwei Variablen, die global deklariert werden.(Ganz oben schreiben. Außerhalb der Subs)
Code:
Private DB As DAO.Database 'Datenbank<br />Private TB As DAO.Recordset 'Tabelle
Und nun übergeben wir an DB den Pfad zur Datenbank. Am besten schreibt ihr das in Form_Load.
Code:
Set Db = OpenDatabase(App.path & "mailaccounts.mdb")
Sollte eigentlich selbsterklärend sein, dass in den Klammern der Pfad zur Datenbank steht. Jetzt haben wir Zugriff auf die Datenbank. Aber wir benötigen noch Zugriff auf die Tabelle „MailAccounts“. Zum öffnen einer Tabelle gibt es vier Möglichkeiten.
Erklärung: Im Modus OpenDynaset wird nicht direkt in die Tabelle geschrieben, sondern die Veränderungen zuerst zwischengespeichert und erst nach einem Refresh der DB sichtbar.
Bei OpenTable greift man direkt auf die Tabelle zu und es lässt sich die besonders schnelle „Seek“ Methode zum suchen benutzen.
OpenSnapShot funktioniert gleich wie OpenDynaset, nur das hier nicht in die DB geschrieben, sondern nur daraus gelesen werden kann.
Bei OpenForwardOnly kann man sich in der DB nur vorwärts bewegen. Falsche Befehle verursachen einen Fehler. Klingt komisch, aber kann nützlich sein, da dieser Modus eine gute Performance bietet.
Wir werden jetzt mal den Modus „dbOpenTable“ benutzen, da ich gerne mit „Seek“ arbeite und dieser Modus sehr schnell ist. Der Code, den ich poste ist auch schon sehr optimiert, so dass ihr auch sehr gute Ergebnisse bei der Geschwindigkeit erhaltet. Der Code zum öffnen der Tabelle sieht dann so aus:
Code:
Set TB = DB.OpenRecordset("MailAccounts", dbOpenTable)
„MailAccounts“ ist der Name unserer Tabelle und danach steht der Modus den wir gewählt haben. Nun haben wir vollen Zugriff auf die Tabelle „MailAccounts“
3. Einträge in der Datenbank erstellen.
Erstellt euch für den Anfang mal zwei Textboxen und einen Button auf eurer Form. Eine Textbox für die Mail Adresse und eine für das dazugehörige Passwort. Dann macht ihr einen Doppelklick auf den Button und hier schreiben wir nun unseren Code zum eintragen der Daten in die Datenbank.
Code:
Dim xMail as string, xPass as string<br />xMail = Text1.Text 'Wir übergeben die Adresse aus Text1.Text an die Variable xMail<br />xPass = Text2.Text 'Wir übergeben das Passwort an die Variable xPass<br /> With Tb<br /> .Index = "MailIndex" 'Hier setzen wir den Index. Somit lässt sich viel schneller suchen.<br /> .Seek Chr(61), xMail 'Hier starten wir die Suche <br /> If .NoMatch Then 'Hier fragen wir ab, ob ein Eintrag gefunden wurde.<br /> .AddNew 'Falls nicht, dann fügen wir jetzt einen neuen hinzu.<br /> !mail = xMail 'Mail wird übergeben<br /> !password = xPass 'Pass wird übergeben<br /> .Update 'Refresh der Datenbank<br /> End If<br /> End With
So. Das sieht jetzt nach relative viel Code aus. Das liegt aber nur daran, dass ich zusätzlich überprüfen lasse ob schon ein Eintrag mit der selben Mail Adresse existiert in der Datenbank. Falls nicht, wird der Eintrag erstellt, ansonsten nicht. Die Stelle „.Seek Chr(61), xMail“ muß ich noch näher erklären. „Chr(61)“ steht für das Zeichen „=“. Ihr könnt zwar auch “=“ schreiben. Aber auf meine Weise ist es etwas schneller. Was dieses Zeichen bewirkt sollte eigentlich auch leicht zu verstehen sein. Es wird ganz einfach nach dem exakten Eintrag gesucht. Ihr könnt auch andere Operatoren wir z.B. „<“ oder „>“ benutzen. „.NoMatch“ wird als True zurückgegeben wenn kein Eintrag in der DB gefunden wurde. Ihr könntet auch „if .NotMatch = True“ schreiben, aber so wie ich es schreibe ist es wiederum schneller.
Einträge übergeben könnt ihr mit „TB!Spaltenname“. In unserem Fall also „TB!mail“ bzw. „!mail“. Man könnte auch „TB.Fields("mail")“ schreiben, aber meine Weise ist etwas schneller.
So könnt ihr also Einträge erstellen und Doppelte verhindern.
4. Bestimmte Einträge suchen und anzeigen.
Jetzt wollen wir eine Art Suchfunktion einbauen, wobei einem dann das Passwort zu dem gesuchten Account angezeigt wird. Macht also einfach einen weiteren Button womit wir die Suche starten können. In diesem fügt ihr diesen Code ein:
Code:
Dim xMail As String<br />xMail = Text1.Text<br /> With TB<br /> .Index = "MailIndex"<br /> .Seek Chr(61), xMail<br /> If Not .NoMatch Then 'Wenn ein Eintrag gefunden wurde wird er an Text2.Text übergeben.<br /> Text2.Text = !password<br /> Else<br /> Call MsgBox("Leider nicht gefunden.")<br /> End If<br /> End With
Ist im Grunde fast das selbe wie oben, außer dass wir jetzt nicht einen Eintrag erstellen sondern, dass wir etwas aus der DB auslesen. Die Zeile mit „If Not .NoMatch then“ kann etwas verwirrend sein. Im Grunde heißt das nicht anderes als „Wenn Nicht .KeinTreffer = Wahr Dann“. Wenn es also nicht True sondern False ist, dann hat er einen Eintrag in der DB gefunden.
Zuletzt zeige ich euch noch wie man sich in der Tabelle bewegt. Wir machen einfach eine Funktion die uns alle Einträge aus der Tabelle ausliest und in ein ListView einträgt.
5. In der Datenbank bewegen.
Erstellt euch dazu ein ListView mit dem Namen „lv“ und einen weiteren Button. Ihr könnt diesen Code aber auch in Form_Load schreiben. Vergesst nicht im ListView Spalten zu erstellen.
Hier noch ein paar Erklärungen: TB.RecordCount (Gibt die Anzahl aller Einträge in der Tabelle zurück.) Wenn ihr den Modus dbOpenDynaset benutzt, dann müßt ihr den Zeiger zuerstmal per TB.MoveLast auf den letzten Eintrag setzen, da ihr sonst nicht den korrekten Wert erhaltet.
TB.AddNew (Fügt einen Datensatz hinzu) TB.Update (Aktualisiert die Tabelle) TB.MoveFirst (Zeiger springt zum Anfang der Tabelle) TB.MoveNext (Zeiger springt zum nächsten Eintrag) TB.MovePrevious (Zeiger springt zum vorherigen Eintrag) TB.MoveLast (Zeiger springt zum letzten Eintrag) TB.Delete (Löscht einen Eintrag/Datensatz) TB.BOF (Ist True wenn der Zeiger am Anfang der Tabelle steht) (Beginning of file) TB.EOF (Ist True wenn der Zeiger am Ende der Tabelle steht) (End of file)
Mit diesen Informationen können wir nun den Code erstellen.
Code:
Dim dbcount As Long, i As Long<br />If Not Tb.BOF Then Tb.MoveFirst 'Falls der Zeiger nicht am Anfang der Tabelle steht wird er dort hinbewegt.<br />dbcount = Tb.RecordCount 'Wir ermitteln wieviele Datensätze unsere DB hat.<br />For i = 1 To dbcount<br />With lv.ListItems.Add<br /> .Text = Tb!mail<br /> .SubItems(1) = Tb!Password<br /> If Not Tb.EOF then Tb.MoveNext<br />End With<br />Next i
So. Das war es wiedermal. Ich hoffe ich konnte euch das programmieren mit Datenbanken etwas näher bringen und zeigen das es eigentlich sehr einfach ist.