VBA Tipp: Feststellen, ob Tabelle existiert

Aus DBWiki
Wechseln zu: Navigation, Suche

Aufgabenstellung

Ich möchte feststellen, ob es in einer Datenbank eine bestimmte Tabelle gibt. Dazu gibt es diverse Lösungen.

Lösung #1

Dies lässt sich mit Hilfe von DAO und dieser Funktion so lösen:

Function DoesTableExist(sTabelle As String, _
         Optional ByVal sDbNameUndPfad As String) As Boolean
 
On Error Resume Next
 
Dim sql As String
 
If Len(sDbNameUndPfad) = 0 Or sDbNameUndPfad = CurrentDb.Name Then
  sDbNameUndPfad = ""
 Else
  sDbNameUndPfad = " IN '" & sDbNameUndPfad & "' "
End If
 
sql = "SELECT Count(*) FROM MSysObjects " & sDbNameUndPfad & _
      " WHERE Name='" & sTabelle & "' AND Type=1"
 
DoesTableExist = CurrentDb.OpenRecordset(sql).Fields(0) > 0
 
End Function

Fehlt der optionale zweite Parameter, so wird die Tabelle in der aktuellen Datenbank gesucht. Gibt man den Pfad und Namen einer anderen Datenbank an, so wird die Tabelle eben in der anderen Datenbank gesucht.

Lösung #2

Soll nur in der aktuellen Datenbank gesucht werden, dann bieten sich auch diese Funktionen an (DAO und ADO):

Function TabExistsDAO(ByVal TabName As String) As Boolean
 
Dim db As DAO.Database
Dim S As String
 
Set db = CurrentDb
 
On Error Resume Next
 
S = db.TableDefs(TabName).Name
TabExistsDAO = (Err.Number = 0)
Err.Clear
 
End Function
Public Function TabExistsADO(ByVal TabName As String) As Boolean
 
Dim dbs As Object
Dim obj As AccessObject
 
Set dbs = Application.CurrentData
 
On Error Resume Next
 
Set obj = dbs.AllTables(TabName)
TabExistsADO = (Err.Number = 0)
Err.Clear
 
End Function

Lösung #3

Eine weitere Möglichkeit ist das Abfragen über ADODB.Connection.OpenSchema.

Public Function TableDefExists(ByVal TabName As String, _
                      Optional ByVal cnn As ADODB.Connection = Nothing) As Boolean
 
Dim rst As ADODB.Recordset
 
If cnn Is Nothing Then
  Set cnn = CodeProject.Connection
End If
 
Set rst = cnn.OpenSchema(adSchemaTables, Array(Empty, Empty, TabName))
TableDefExists = Not rst.EOF
rst.Close
 
End Function

Diese Variante kann auch für andere DBMS verwendet werden, wenn eine entsprechende ADODB.Connection an den 2. Parameter übergeben wird.

Lösung #4

Auch diese Lösung basiert darauf, einen evtl. auftretenden Laufzeitfehler bei dem Zugriff auf die (nicht existierende) Tabelle abzufragen.

Public Function TableExists(ByVal strTabName) As Boolean
 
On Error Resume Next
 
DCount "*", strTabName
TableExists = (Err.Number = 0)
Err.Clear
 
End Function


Wiki faq.png FAQ: Dieser Artikel gehört zu den "Häufig gestellten Fragen" (FAQ). Die Seite Access-FAQ bietet eine Übersicht aller FAQ-Artikel.