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.

Datentypen
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.

Eigenschaften
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.

HinweisEin 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