VB, DAO, Datenbank

           

DAO

Erzeugen einer vollständigen Datenbank
direkt aus einem Visual Basic Programm

Das folgende Programmbeispiel erzeugt eine passwortgeschützte Datenbank (Access mdb-Format) mit den beiden Tabellen "DDaten" und "Währungen". Das Passwort ist in der Datenbank selbst enthalten (Nicht zu verwechseln mit Schutz auf Benutzerebene über System.mdw)

Relation.gif (3169 Byte)Die beiden Tabellen stehen zueinander in einer 1:n - Beziehung mit Aktualisierungsweitergabe an Detailfeld.
Über das in beiden Tabellen enthaltene Feld "WKz" erfolgt die Verknüpfung.
Der Name des Feldes ("WKz") muß nicht unbedingt in beiden Tabellen gleich sein. Es könnten auch unterschiedliche Namen gewählt werden. Gleicher Name soll nur verdeutlichen, dass für beide Tabellen eine Beziehung über dieses Feld besteht.
"WKz" ist in der Tabelle "Währungen" eindeutig (1 der 1:n - Beziehung).
In der Tabelle "DDaten" kann "WKz" mehrfach auftreten (n der 1:n - Beziehung)
 

Public Function MakeNewDatabase() as Boolean

'Neue Datenbank mit den Tabellen "Währungen" und "DDaten" erzeugen
'Rückgabewert true, wenn Datenbank fehlerfrei erzeugt wurde
'Rückgabewert false, wenn ein Fehler aufgetreten ist

Const DBPwd="beliebiges Passwort"
Const DBFilename ="C:\Verzeichnis\DB.mdb"

Dim pWS as Workspace
Dim DB as Database
Dim TD As TableDef
Dim Fld As Field
Dim Idx As Index
Dim Rel As Relation
Dim RS As Recordset
Dim TblName As String

On Error GoTo Fehler

'Objektvariable pWS auf Standardworkspace setzen
set pWS = Workspaces(0)

'DB erzeugen
Set DB = pWS.CreateDatabase(DBFileName, dbLangGeneral & ";pwd=" & DBPwd)

'Tabelle Währungen erzeugen
Set TD = DB.CreateTableDef("Währungen")

'jetzt werden die in "Währungen" enthaltenen Felder erzeugt
'Feld WKZ erzeugen (CreateField) und an Fieldsauflistung hängen (Append)
TD.Fields.Append TD.CreateField("WKz", dbText, 8)

'Feld Faktor mit Attribut "Eingabe erforderlich" erzeugen
Set Fld = TD.CreateField("Faktor", dbDouble)
Fld.Required = True 'Erst Attribut "Eingabe erforderlich" setzen
TD.Fields.Append Fld 'und dann Feld an Fieldsauflistung hängen

'Felder Währung, Std, Datum und UID erzeugen und an Fieldsauflistung hängen.
'Da die Felder keine besonderen Attribute erhalten, kann CreateField und Append wieder in einem Aufruf erfolgen
TD.Fields.Append TD.CreateField("Währung", dbText, 24)
TD.Fields.Append TD.CreateField("Std", dbBoolean)
TD.Fields.Append TD.CreateField("Datum", dbDate)
TD.Fields.Append TD.CreateField("UID", dbInteger)

'TableDef TD an TableDefs-Auflistung hängen
DB.TableDefs.Append TD

'Primärschlüssel (Feld WKz in Tabelle Währungen) setzen
Set Idx = TD.CreateIndex("idxWKz") 'Index erzeugen
Idx.Primary = True 'Primärschlüssel
Idx.Required = True 'Eingabe erforderlich
Idx.Fields.Append TD.CreateField("WKz") 'Stellt Verbindung WKz - Index her
TD.Indexes.Append Idx 'Index an Indexes-Auflistung hängen

'Tabelle DDaten erzeugen
TblName = "DDaten"
Set TD = DB.CreateTableDef(TblName)
'Feld "ID" mit Attribut "Eingabe erforderlich" erzeugen
Set Fld = TD.CreateField("ID", dbLong)
Fld.Required = True       'Eingabe erforderlich
TD.Fields.Append Fld

'Übrige Felder der Tabelle "DDaten erzeugen"
TD.Fields.Append TD.CreateField("Pos", dbLong)
TD.Fields.Append TD.CreateField("WKz", dbText, 8)
TD.Fields.Append TD.CreateField("Betrag", dbCurrency)
TD.Fields.Append TD.CreateField("Bemerkung", dbMemo)
DB.TableDefs.Append TD

'Feld "ID" indizieren (Dieses Feld steht über dieses Feld zu einer anderen hier nicht aufgeführten Tabelle in Beziehung)
Set Idx = TD.CreateIndex("idxID")
Idx.Required = True
Idx.Fields.Append TD.CreateField("ID")
TD.Indexes.Append Idx
Set Idx = TD.CreateIndex("idxIDPos")
Idx.Fields.Append TD.CreateField("ID")
Idx.Fields.Append TD.CreateField("Pos")
Idx.Unique = True 'eindeutig, keine mehrfach vorkommenden Werte zulässig

'Beziehung Währungen.WKz - DDaten.WKz herstellen
'Aktualisierungsweitergabe an Detailfeld wird durch "dbRelationUpdateCascade" erreicht.
Set Rel = DB.CreateRelation("WDD", "Währungen", "DDaten", dbRelationUpdateCascade)
' "WDD" ist der frei wählbare Name der Beziehung, "Währungen" u. "DDaten" sind die Namen der in Beziehung stehenden Tabellen
Rel.Fields.Append Rel.CreateField("WKz")
Rel.Fields!WKz.ForeignName = "WKz"
DB.Relations.Append Rel

DB.Close
On Error GoTo 0

'Rückgabewert für Funktion auf True setzen, da alles fehlerfrei gelaufen ist
MakeNewDatabase = True

Exit Function

Fehler:

'Code für Fehlerbehandlung bzw. Aufruf einer Fehlerbehandlungsroutine mit z.B. Ausgabe einer Msg-Box mit entsprechender Fehlerinformation
'...
'...
'...

'Rückgabewert für Funktion auf False setzen, da ein Fehler aufgetreten ist
MakeNewDatabase = False

End Function

 

               

 


DAO

VisualBasic und passwortgeschützte Access-Datenbanken.

Access unterscheidet zwei Arten von Passwortschutz.

Die eine ist der Schutz mit Hilfe einer "System.mdw" - Datei.
Benutzer und Passwort sind in dieser Datei eingetragen.
Nur wenn diese Datei vorhanden ist, kann die damit geschützte Datenbank geöffnet werden
.
Access.mdbs lönnen aber auch durch ein internes Datenbankkennwort geschützt werden. Dieses Kennwort muss beim öffnen der DB übergeben werden. 

Access-Datenbanken können auch mit einem internen Passwort geschützt werden.
 

Hierbei wird dann nicht auf die System.mdw zugegriffen, das Passwort ist in der Datenbank selbst hinterlegt.

Ist die Datenbank mit einem internen Passwort versehen ist, dann muss das
Passwort beim öffnen der Datenbank übergeben werden:


Dim DBFilenName as String
Dim DBPassWd as String

DBFileName = "Vollst
ändiger Pfad zu Datenbank.mdb"
DBPassWd = "Passwort"

'Datenbank öffnen
Set pDB = pWS.OpenDatabase(DBFileName, False, False, ";Pwd=" & DBPassWd)
'das Semikolon vor Pwd nicht vergessen!!!