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
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
xMail = Text1.Text 'Wir übergeben die Adresse aus Text1.Text an die Variable xMail
xPass = Text2.Text 'Wir übergeben das Passwort an die Variable xPass
With Tb
.Index = "MailIndex" 'Hier setzen wir den Index. Somit lässt sich viel schneller suchen.
.Seek Chr(61), xMail 'Hier starten wir die Suche
If .NoMatch Then 'Hier fragen wir ab, ob ein Eintrag gefunden wurde.
.AddNew 'Falls nicht, dann fügen wir jetzt einen neuen hinzu.
!mail = xMail 'Mail wird übergeben
!password = xPass 'Pass wird übergeben
.Update 'Refresh der Datenbank
End If
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
xMail = Text1.Text
With TB
.Index = "MailIndex"
.Seek Chr(61), xMail
If Not .NoMatch Then 'Wenn ein Eintrag gefunden wurde wird er an Text2.Text übergeben.
Text2.Text = !password
Else
Call MsgBox("Leider nicht gefunden.")
End If
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
If Not Tb.BOF Then Tb.MoveFirst 'Falls der Zeiger nicht am Anfang der Tabelle steht wird er dort hinbewegt.
dbcount = Tb.RecordCount 'Wir ermitteln wieviele Datensätze unsere DB hat.
For i = 1 To dbcount
With lv.ListItems.Add
.Text = Tb!mail
.SubItems(1) = Tb!Password
If Not Tb.EOF then Tb.MoveNext
End With
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.
Hf, ZiG _________________
Zuletzt bearbeitet von ZiG_ am 19.12.2007, 10:33, insgesamt 2-mal bearbeitet
Viktor « Webmaster »
Anmeldedatum: 08.12.2006 Beiträge: 354 Wohnort: Berlin
Verfasst am: 06.08.2007, 13:49
Da hier keiner Postet schreib ich dir mal was dazu.
Ich finde dein Paper wie die anderen auch mehr als gelungen.
Hab dabei selber noch viel gelernt, da ich mich mit Datenbanken noch nicht beschäftigt habe.
Bleibt nur die Frage warum keiner antwortet, villeicht weil es nichts mit Viren, Trojanern oder Floodern zu tun hat?
Mach auf jeden Fall weiter so, ich freu mich schon auf dein nächstes Paper.
MfG,
enco
Amethyst_ Poster
Anmeldedatum: 24.02.2007 Beiträge: 172
Verfasst am: 06.08.2007, 13:52
Jo ganz vergessen zu antworten.
Man sieht, dass du dir echt Mühe gegeben hast. Man versteht alles, und ich denke auch, dass DAO ein wichtiges Thema ist.
Freue mich auf dein nächstes Tut! _________________
Bahamut_ « Moderator »
Anmeldedatum: 12.12.2006 Beiträge: 250
Verfasst am: 06.08.2007, 13:56
Zitat:
Bleibt nur die Frage warum keiner antwortet, villeicht weil es nichts mit Viren, Trojanern oder Floodern zu tun hat?
Du willst doch deiner Community nichts vorwerfen oder?
Dass ZiG´s Tuts gelungen sind trifft natürlich wie immer zu, nur ich hab es nicht gelesen, weil ich bisher keine Datenbank gebraucht habe und ich werde es machen wenn ich es brauche.
Wenn ich das Tut jetzt lese aber nix dazu programmiere, lern ich nix dabei und vergess wieder viel. Deshalb wart ich lieber bis ich ne Datenbank brauche.
Anmeldedatum: 08.12.2006 Beiträge: 354 Wohnort: Berlin
Verfasst am: 06.08.2007, 13:58
Bahamut hat Folgendes geschrieben:
Zitat:
Bleibt nur die Frage warum keiner antwortet, villeicht weil es nichts mit Viren, Trojanern oder Floodern zu tun hat?
Du willst doch deiner Community nichts vorwerfen oder?
Wie käme ich denn dazu, blos weil ich die Hits der Threads verglichen habe?
Nein natürlich nicht
r4z3r_ « Webmaster »
Anmeldedatum: 06.02.2007 Beiträge: 252
Verfasst am: 06.08.2007, 14:24
ok dann bekommste deinen post;)
habs mir nicht durchgelesen weil ich im urlaub war
und nach den ferien war der thread dann anscheinend ganz weit unten^^
habs aber nachgeholt, dein paper ist echt gut! man versteht so ziemlich alles
hoffe da kommen bald weitere von dir
mfg
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 06.08.2007, 14:50
Hoppla! Was ist denn hier los?
Doch ein paar die sich dafür interessieren.^^ _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
Wer hätts gedacht das ich sowas mal brauche, aber naja wirklich ein gutes Tut Zig (wie immer im grunde)
allerdings hab ich ein paar fragen. Ich hab mir jetzt auch ne Datenbank gemacht und muss diese auslesen/durchsuchen.
Wofür sind .index und was muss man setzen bei anderen Datenbanken und warum immer !mail oder !password
EDIT;// das mit dem index is geklärt aber was macht man wenn man ne Table ohne index hat oder wie findet man das überhaupt raus? _________________
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 11.08.2007, 20:07
Wenn du eine Datenbank per Visual Data Manager öffnest, müsstest du sehen können ob ein Index für eine oder mehrere Spalten erstellt wurde oder nicht.
Ob man das im Programm irgendwie auslesen kann weiß ich nicht.
Per "Seek" kann man nur in Indexierten Spalten suchen. Dafür ist diese Methode aber extrem schnell.
Wenn du keinen Index benutzen willst, dann mußt du eine andere Methode wählen, wie du die Datenbank öffnest.
Normal benutzt man "OpenDynaset". Und zum suchen dann die Funktionen "FindFirst, FindNext, FindLast, FindPrevious" etc.
Beispiel:
[vb:1:0b3b9dc0b9]
Set Tb = Db.OpenRecordset("MailAccounts", dbOpenDynaset)
Tb.FindFirst ("Spaltenname=" & "'" & WonachGesuchtWerdenSoll & "'")
If Tb.NoMatch Then
'Nicht gefunden
Else
'Gefunden
End If
[/vb:1:0b3b9dc0b9]
Die Schreibweise !mail nutze ich, da es angeblich noch etwas schneller sein soll als, tb.Fields("mail"). Bei beiden Schreibweisen greift man auf die Spalte mail zu, auf die der Zeiger in der Datenbank gerade zeigt.
Edit//
Einen Index in der Datenbank zu benutzen erhöht die Geschwindigkeit übrigens enorm.
Wäre schon wichtig einen zu setzen.
mfg _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
Ok danke. Werd mal schauen wie sich das verhält. Bei fragen wirste nochmal von mir hören ^^
EDIT:// hoffe mal das du das noch liest ^^
Ich hab das jetzt mit den Index verstanden und benutzt und ja du hast recht es ist erheblich schneller. Meine frage wäre jetzt wie kann man mehrere Spalten aufeinmal durchsuchen. ICh hab erst mehrere indexiert nur dann kam immer nicht gefunden. Wenn ich eine Indexiere geht es vorrausgesetzt es ist die richtige. Also wie könnte ich jetzt alle durchsuchen? _________________
Elrohir_ Tutorial Leser
Anmeldedatum: 10.09.2007 Beiträge: 59
Verfasst am: 19.09.2007, 17:58
Hallo und erst einmal danke für das Tutorial.
Hat zumindest mir sehr weitergeholfen, vor allem, da ich gerade an einem Projekt arbeite, wo ich datenbanken benötige...
Ich habe auch alles verstanden, und hinbekommen ausser den letzten Abschnitt...
an der Stelle beim auflisten des Inhaltes der Datei sagt er mir an der stelle
Code:
With lv_Friendlist.ListItems.Add
.Text = TB!Name
.SubItems(1) = TB!Passwort
.SubItems(2) = TB!Anmeldedatum
End With
dass bei der Zeile .SubItems(1) = TB!IP ein ungültiger Eigenschaftswert herrschen würde...
hm, ist vielleicht nen dämliches Beispiel... wozu man die Datenbank da bräuchte ist mir auch noch unklar xD , aber es geht mir mehr allgemein um den Fehler, wenn ich versuche, mehrere Subitems aufzulisten....
Also hat dein Problem nix mit der db zu tun sondern mit dem lv^^, egal
ps: mein instinkt sagt mir das du danach ein neues Problem haben wirst xD _________________
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 19.09.2007, 21:04
Nein er muß keinen Index angeben, da er ja einen Eintrag im ListView erstellt.
Ich würde mal eher sagen, dass du im ListView einfach vergessen hast die nötigen Spalten zu erstellen, oder es in der Datenbank einfach nicht die Spalte "IP" gibt.
@TheCoder
Hast recht. Ich habs nicht mehr gelesen^^.
Ich weiß es leider auch nicht genau. Hab ich bisher nicht gebraucht.
Aber ich denke schon, das man beim Index erstellen einfach mehrere Spalten angibt.
Das darf man ja auch, also muß es ja irgendwie so gehen. _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
r4z3r_ « Webmaster »
Anmeldedatum: 06.02.2007 Beiträge: 252
Verfasst am: 20.09.2007, 11:44
hmm hast recht, hat nichts mit dem Index zu tun. _________________
Alpha63_ Newbie
Anmeldedatum: 05.12.2007 Beiträge: 2
Verfasst am: 13.03.2008, 15:45
nice tut
frage mit dem listeview
wie geht das also ist das ein botton oder ein label oder was ist damit gemeind???
und kann man die datenbank auch anschliesend an eine e-mail adresse senden so ne art backup versteht sich
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 13.03.2008, 15:48
Was mit ListView gemeint ist?
Ist einer ListBox ähnlich.
Findest du bei den "Microsoft Common Controls 6.0"
Die Datenbank ist eine Datei. Also kannst du die Datei auch versenden. _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
regenz11_ Coder
Anmeldedatum: 29.07.2007 Beiträge: 77
Verfasst am: 17.03.2008, 13:12
Also Zig macht die besten Tutorials die ich jeh im meinem Leben gesehen habe ! Immer 1a ! Danke ! _________________
Maybe_ Newbie
Anmeldedatum: 17.03.2008 Beiträge: 2
Verfasst am: 17.03.2008, 17:09
bei dem "Set" kommt bei mir Compile Error: Invalid outsite procedure?
dachte das hat was mit dem verweis zu tun, aber den habe ich bereits überprüft und der ist korrekt.
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 17.03.2008, 17:34
Schreibst du den Teil auch innerhalb einer Prozedur? _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
Maybe_ Newbie
Anmeldedatum: 17.03.2008 Beiträge: 2
Verfasst am: 17.03.2008, 19:11
wie meinst du das? ich dachte ich soll das mit den anderen befehlen ganz an den anfang stellen und daraufhin die anderen sachen machen. ich hab dich mal in icq geaddet, hab noch nicht soviel erfahrung und will mich hier nicht unbedingt zum deppen machen . vielleicht kannst du mir da ja antworten
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 17.03.2008, 19:22
Zitat:
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")
_________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)
swordfish123456_ Tutorial Leser
Anmeldedatum: 15.08.2007 Beiträge: 66
Verfasst am: 30.03.2008, 16:42
ich finde dein tutorial auch super gelungen ^^
ne , sehr gut sogar xD
aber mich würde das ganze noch mit MySQL interessieren =O
falls jemand mal zeit & lust , bzw zeit & zeit hat könnte er ja genau so ein tutorial wie Zig machen ,bloss mit MySql =)
das wäre nicq
mfg
super tutorial =)
mfg
marcel1994_ Coder
Anmeldedatum: 08.02.2008 Beiträge: 202
Verfasst am: 30.04.2008, 22:15
so ich programmiere gerade ein kleines kassensystem mit diesem TuT hier. Ich finds auch super Zig muss ich echt sagen! Also, was mein problem ist, ist, dass ich nicht weiß, wie ich einen eintrag löschen soll. Hier mein Code dazu (denke mal völlig falsch, also lachen erlaubt xD):
Code:
With TB
.Delete
!S_N = artikel
!preis = preis
!Beschreibung = descr
.Update
End With
Eig kann das ja auchgarnicht funzen, da ja nochkein datensatz eingespeichert ist aber naja ... hoffe auf schnelle hilfe. _________________
ZiG_ Überflieger
Anmeldedatum: 07.03.2007 Beiträge: 1248
Verfasst am: 30.04.2008, 23:40
Nur ".Delete" genügt.
Du mußt den richtigen Eintrag vorher natürlich suchen, oder zumindest den Zeiger in der Db per Movefirst, last, next oder previous an die richtige position bewegen.
Dann einfach .Delete und der Eintrag ist gelöscht.
Un ähmm, ja. Wenn noch nichts drinnen ist, wird das löschen natürlich nicht gehen. _________________ Wer nicht auf seine Weise denkt, denkt überhaupt nicht. (Oscar Wilde)