|
|
VB, DAO, Datenbank |
|
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)
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
|
|
|
|
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.
öffnen einer per System.mdw geschützten Datenbank:
Dim WS as Workspace
Dim DB as DataBase
Dim SysMdwFileName as String
Dim DBFileName as String
DBFileName = "vollständiger Pfad zur Datenbank.mdb"
SysMdwFileName = "vollständiger Pfad zur System.mdw"
'DBEngine mitteilen, wo die System.mdw liegt
DBEngine.SystemDB = SysMdwFileName
'Workspace mit dem Namen "MyWs" für User "VisualBasic" mit
Passwort "goto" erzeugen
Set WS = DBEngine.CreateWorkspace("MyWs", "VisualBasic", "goto", dbUseJet)
'und dann die DB öffnen
Set DB = WS.OpenDatabase(DBFileName, False)
öffnen einer mit einem internen Datenbankpasswort geschützten Datenbank.
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!!!
|
|
|
|