Tabellen - Erstellen
Wie kann ich eine Tabelle anlegen?
Das Erstellen einer Tabelle erfolgt mit DAO oder ADOX auf dieselbe Weise. Zuerst wird das Objekt erstellt (TableDef oder Table), dann werden die Spalten hinzugefügt (Field- oder Column-Objekte), und abschließend wird die Tabelle der Auflistung hinzugefügt. Obwohl der Ablauf gleich ist, weicht die Syntax leicht ab.
Bei ADOX ist es nicht notwendig, eine Methode zum Erstellen der Spalte zu verwenden, bevor diese zur Auflistung hinzugefügt wird. Die Append-Methode kann sowohl zum Erstellen als auch zum Anhängen der Spalte verwendet werden.
Leider sind die Datentypennamen für die Spalten in DAO, ADOX und SQL unterschiedlich. In der folgenden Tabelle ist aufgeführt, welche für Microsoft Jet-Datenbanken anwendbare DAO-Datentypen den ADO-Datentypen entsprechen.
| DAO-Datentyp | ADO-Datentyp | SQL |
| dbBinary | adBinary | BINARY |
| dbBoolean | adBoolean | BIT |
| dbByte | adUnsignedTinyInt | BYTE |
| dbCurrency | adCurrency | CURRENCY |
| dbDate | adDate | DATE |
| dbDecimal | adNumeric | DECIMAL |
| dbDouble | adDouble | DOUBLE |
| dbGUID | adGUID | GUID |
| dbInteger | adSmallInt | SMALLINT |
| dbLong | adInteger | INT |
| dbLongBinary | adLongVarBinary | LONGBINARY |
| dbMemo | adLongVarWChar | MEMO |
| dbSingle | adSingle | SINGLE |
| dbText | adVarWCha | TEXT |
Detaillierte Informationen über alle möglichen Feldtypen/-größen finden Sie in der Online-Hilfe von Visual-Basic bzw. Access.
Obwohl in den unteren Beispielen nicht immer dargestellt ist, gibt es für Tabellen oder Spalten eine Reihe weiterer Attribute, die beim Erstellen einer Tabelle oder Spalte mit der DAO Attributes-Eigenschaft eingestellt werden können. In der Tabelle unten ist dargestellt, wie diese Attribute den ADO- und Microsoft Jet Provider-spezifischen Eigenschaften zugeordnet werden.
| DAO-TableDef | Wert | ADOX-Table | Wert |
| Attribute | dbAttachExclusive | Jet OLEDB:Exclusive Link | True |
| Attribute | dbAttachSavePWD | Jet OLEDB:Cache Link Name/Password | True |
| Attribute | dbAttachedTable | Type | "LINK" |
| Attribute | dbAttachedODBC | Type | "PASS-THROUGH" |
| Attribute | dbAutoIncrField | AutoIncrement | True |
| Attribute | dbFixedField | ColumnAttributes | adColFixed |
| Attribute | dbHyperlinkField | Jet OLEDB:Hyperlink | True |
| Attribute | dbSystemField | Keine Entsprechung | - |
| Attribute | dbUpdatableField | Attributes (Field-Objekt) | adFldUpdatable |
| Attribute | dbVariableField | ColumnAttributes | Not adColFixed |
DAO-Variante
In nachstehenden Beispiel wird eine neue Tabelle mit allen möglichen Datentypen (falls nicht vorhanden) erstellt. Exemplarisch wird auch aufgeführt, wie man ein AutoWert-Feld erstellt und wie man die diversen Eigenschaften wie z.B. Standardwert, "Eingabe erforderlich", "Leere Zeichenfolge" und Hyperlink setzen kann.
Es gibt zwar noch mehr Feldtypen, aber diese sind nur in der Zusammenarbeit mit der MSDE bzw. dem SQL-Server über ADO zulässig und können über diese Funktionen nicht angelegt werden.
Beispiel:
Public Function DAO_CreatedNewTable(pDbs As DAO.Database) As Boolean On Error GoTo HandleErr '// Die benötigten Objektvariablen '// ein Verweis auf Microsoft DAO 3.X Object Library '// muss gesetzt sein Dim tdef As DAO.TableDef Dim tfld As DAO.Field Dim tidx As DAO.Index '// Initialisierung DAO_CreatedNewTable = False '// Ist die Tabelle bereits vorhanden If TableExistsDAO(pDbs, "NewTableDao") = False Then '// Erstellung der neuen Tabelle Set tdef = pDbs.CreateTableDef("NewTableDao") With tdef '// neues AutoWert-Feld erstellen Set tfld = .CreateField("fAutoWert", dbLong) ' z.B. AutoWert-Eigenschaft setzen tfld.Attributes = tfld.Attributes Or dbAutoIncrField ' Fügt das Feld in die Tabelle hinzu. .Fields.Append tfld '// ************************** '// neues Byte-Feld erstellen Set tfld = .CreateField("fByte", dbByte) ' z.B. Standardwert hinzufügen tfld.DefaultValue = 3 .Fields.Append tfld '// ************************** '// neues Integer-Feld erstellen Set tfld = .CreateField("fInt", dbInteger) ' z.B. Eingabe erforderlich: Ja tfld.Required = True .Fields.Append tfld '// ************************** '// neues Long-Feld erstellen Set tfld = .CreateField("fLong", dbLong) .Fields.Append tfld '// ************************** '// neues Single-Feld erstellen Set tfld = .CreateField("fSingle", dbSingle) .Fields.Append tfld '// ************************** '// neues Double-Feld erstellen Set tfld = .CreateField("fDouble", dbDouble) .Fields.Append tfld '// ************************** '// neues Währungsfeld erstellen Set tfld = .CreateField("fCurrency", dbCurrency) .Fields.Append tfld '// ************************** '// Neues Datums-Feld erstellen Set tfld = .CreateField("fDateTime", dbDate) .Fields.Append tfld '// ************************** '// Neues Replikations-ID-Feld erstellen Set tfld = .CreateField("fGUID", dbGUID) .Fields.Append tfld '// ************************** '// Neues Ja/Nein-Feld erstellen Set tfld = .CreateField("fBoolean", dbBoolean) .Fields.Append tfld '// ************************** '// Neues Text-Feld erstellen Set tfld = .CreateField("fText", dbText) With tfld ' z.B. Feldgröße .Size = 30 ' z.B. Leere Zeichenfolge: Ja .AllowZeroLength = True End With .Fields.Append tfld '// ************************** '// Neues Memo-Feld erstellen Set tfld = .CreateField("fMemo", dbMemo) tfld.Attributes = dbVariableField .Fields.Append tfld '// ************************** '// Neues Hyperlink-Feld erstellen (erst ab Jet 4.0) Set tfld = .CreateField("fLink", dbMemo) With tfld ' Hyperlink-Eigenschaft festlegen .Attributes = dbHyperlinkField .AllowZeroLength = True End With .Fields.Append tfld '// ************************** '// Neues Blob-Feld mit fester Feldgröße erstellen Set tfld = .CreateField("fBinary", dbBinary) .Fields.Append tfld '// ************************** ' // Neues Ole-Objekt-Feld erstellen Set tfld = .CreateField("fOle", dbLongBinary) .Fields.Append tfld '// ************************** End With '// Neue Tabelle in der Datenbank erstellen pDbs.TableDefs.Append tdef DAO_CreatedNewTable = True End If HandleExit: '// Speicher freigeben If Not tdef Is Nothing Then Set tdef = Nothing If Not tfld Is Nothing Then Set tfld = Nothing Exit Function HandleErr: Select Case Err.Number Case Else MsgBox "Fehler " & Err.Number & ": " & _ Err.Description, vbCritical, _ "modKap02.DAO_CreatedNewTable" End Select DAO_CreatedNewTable = False Resume HandleExit End Function
ADOX-Variante
Nun das gleiche Beispiel mit der ADOX-Bibliothek. Beachten Sie dabei die Zeile, in der die Eigenschaft ParentCatalog gesetzt wird. Diese Eigenschaft gibt den übergeordneten Katalog einer Tabelle oder Spalte an, um den Zugriff auf providerspezifische Eigenschaften bereitzustellen.
Ein kleiner Hinweis zur Bibliothek!: Zwei Bereiche werden von ADO nicht abgedeckt. Erstellung von Datenbanken, Tabellen und Abfragen sowie Sicherheitsfunktionen. Für das Fehlen gibt es zwei Gründe: Erstens sind beide Bereiche durch SQL-Befehle abgedeckt (s.u.), die über Command- oder Connection-Objekte ausgeführt werden können und zweitens sind die Unterschiede zwischen Datenbanksystemen gerade in diesen Bereichen am größten.
Microsoft hat zusätzlich die ADOX-Bibliothek entwickelt, die einen einfachen, vom Datenbankprodukt unabhängigen Zugriff auf Datendefinitionen- und Sicherheitsfunktionen ermöglichen sollen. Voraussetzung für den Einsatz von ADOX ist allerdings, dass der OLE-DB-Provider die entsprechende Funktionalität bereitstellt. Allgemein ist es jedoch so, dass nur der Jet 4.0 OLE-DB-Provider fast alle ADOX Funktionen unterstützt. Letztendlich bedeutet dies, dass ADOX eigentlich nur für Access-Datenbanken eingesetzt werden kann.
Beispiel:
Function ADO_CreatedNewTable(pcnn As ADODB.Connection) As Boolean '// Die benötigten Objektvariablen '// ein Verweis auf Microsoft ADO Ext. 2.X '// for DDL and Security muss gesetzt sein On Error GoTo HandleErr Dim cat As New ADOX.Catalog Dim tbl As New ADOX.Table Dim col As New ADOX.Column '// Initialisierung ADO_CreatedNewTable = False cat.ActiveConnection = pcnn '// Ist die Tabelle bereits vorhanden If TableExistsADOX(cat, "NewTableAdo") = False Then With tbl ' Diese Zeile ist notwendig, ' damit die Datenbankspezifischen ' Eigenschaften wie z.B. AutoWert ' etc. pp. gesetzt werden können .ParentCatalog = cat '// Erstellung der neuen Tabelle .Name = "NewTableAdo" '// neue Felder hinzufügen s.o. .Columns.Append "fAutoWert", adInteger ' z.B. AutoWert-Eigenschaft setzen Set col = tbl.Columns("fAutoWert") col.Properties("Autoincrement") = True '// Neues Byte-Feld hinzufügen .Columns.Append "fByte", adUnsignedTinyInt Set col = .Columns("fByte") ' z.B. Standardwert hinzufügen col.Properties("Default") = 3 .Columns.Append "fInt", adSmallInt .Columns.Append "fLong", adInteger Set col = .Columns("fLong") ' Entegen zu DAO wird bei der Erstellung ' von Feldern die Required grundsätzlich ' immer auf True gesetzt. Deswegen, sollte ' man darauf achten dies ggf. zu ändern ' z.B. Eingabe erforderlich = nein col.Properties("Nullable").Value = True .Columns.Append "fSingle", adSingle .Columns.Append "fDouble", adDouble .Columns.Append "fCurrency", adCurrency .Columns.Append "fDateTime", adDate .Columns.Append "fGUID", adGUID .Columns.Append "fBoolean", adBoolean '// Neues Textfeld erstellen .Columns.Append "fText", adWChar Set col = .Columns("fText") With col ' z.B. Feldgröße setzen .DefinedSize = 30 ' z.B. Leere Zeichenfolge setzen col.Properties("Jet OLEDB:Allow Zero Length") = True End With .Columns.Append "fMemo", adLongVarWChar '// Neues Hyperlink-Feld erstellen (erst ab Jet 4.0) .Columns.Append "fLink", adLongVarWChar Set col = .Columns("fLink") With col ' z.B. Leere Zeichenfolge setzen .Properties("Jet OLEDB:Allow Zero Length") = True ' z.B. Hyperlink-Eigenschaft setzen .Properties("Jet OLEDB:Hyperlink") = True End With .Columns.Append "fBinary", adVarBinary .Columns.Append "fOle", adLongVarBinary End With cat.Tables.Append tbl ADO_CreatedNewTable = True End If HandleExit: '// Speicher freigeben If Not col Is Nothing Then Set col = Nothing If Not tbl Is Nothing Then Set tbl = Nothing If Not cat Is Nothing Then Set cat = Nothing Exit Function HandleErr: Select Case Err.Number Case Else MsgBox "Fehler " & Err.Number & ": " & _ Err.Description, vbCritical, _ "modKap02.ADO_CreatedNewTable" End Select ADO_CreatedNewTable = False Resume HandleExit End Function
SQL-DDL-Variante
Es gibt verschiedene Wege, um über SQL-DDL-Anweisungen mit Microsoft Jet zu kommunizieren. Diese Möglichkeit bedient sich der Execute-Methode bei der SQL-Anweisungen übergeben werden. Dabei wird das Common DDL (Data Definition Language) SQL Statement verwendet. Man sollte dabei erwähnen, dass zum Anlegen von Tabellen einige Möglichkeiten zum Einstellen von Feldeigenschaften fehlen und daher die Varianten DAO/ADOX empfehlenswerter sind. Die Execute-Methode ist bei anderen Aktionen (z.B. ändern der Feldgröße) einfacher anzuwenden, als die herkömmliche Möglichkeit über TableDefs bzw. Tables.
Wenn Sie eine neue Tabelle mit einem SQL-DDL-Kommando anlegen, muss die einfachste Formulierung folgendem Muster genügen:
CREATE TABLE MeineTabelle (MeinTextfeld TEXT);
Und nun auf unser o.g. Beispiel bezogen:
Beispiel:
'// DAO-Variante Public Function DDL_CreateNewTableDAO(pdbs As DAO.Database) As Boolean On Error GoTo HandleErr Dim sSql As String '// Initialisierung DDL_CreateNewTableDAO = False '// Die SQL-DDL Anweisung sSql = "CREATE TABLE NewTableSQL ( fAutoWert COUNTER, fByte BYTE " & _ "NOT NULL, fInt SMALLINT, fLong INT, fSingle SINGLE, " & _ "fDouble DOUBLE, fCurrency CURRENCY, fDateTime DATE, " & _ "fGUID GUID, fBoolean BIT, fText CHAR (30), fMemo MEMO, " & _ "fBinary BINARY, fOle LONGBINARY );" '// Falls die Tabelle noch nicht vorhanden ist If TableExistsDAO(pdbs, "NewTableSQL") = False Then pdbs.Execute sSql, dbFailOnError DDL_CreateNewTableDAO = True End If HandleExit: Exit Function HandleErr: Select Case Err.Number Case Else MsgBox "Fehler " & Err.Number & ": " & _ Err.Description, vbCritical, _ "modKap02.DDL_CreateNewTableDAO" End Select DDL_CreateNewTableDAO = False Resume HandleExit End Function '// ADO-Variante Public Function DDL_CreateNewTableADO(pcnn As ADODB.Connection) As Boolean On Error GoTo HandleErr Dim sSQL As String '// Initialisierung DDL_CreateNewTableADO = False '// Die SQL-DDL Anweisung '// unter ADO-SQL-DDL ist es auch möglich, einen '// Standardwert anzugeben (s. fByte) sSQL = "CREATE TABLE NewTableSQL ( fAutoWert COUNTER, fByte BYTE DEFAULT 3 " & _ "NOT NULL, fInt SMALLINT, fLong INT, fSingle SINGLE, " & _ "fDouble DOUBLE, fCurrency CURRENCY, fDateTime DATE, " & _ "fGUID GUID, fBoolean BIT, fText CHAR (30), fMemo MEMO, " & _ "fBinary BINARY, fOle LONGBINARY );" '// Falls die Tabelle noch nicht vorhanden ist If TableExistsADOX(pcnn, "NewTableSQL") = False Then pcnn.Execute sSQL, dbFailOnError DDL_CreateNewTableADO = True End If HandleExit: Exit Function HandleErr: Select Case Err.Number Case Else MsgBox "Fehler " & Err.Number & ": " & _ Err.Description, vbCritical, _ "modKap02.DDL_CreateNewTableADO" End Select Resume HandleExit End Function