2010-07-28 131 views

Respuesta

27

Establecer una referencia a la Biblioteca de objetos de Microsoft Access 12.0 nos permite comprobar si existe una tabla con DCount.

Public Function ifTableExists(tblName As String) As Boolean 

    If DCount("[Name]", "MSysObjects", "[Name] = '" & tblName & "'") = 1 Then 

     ifTableExists = True 

    End If 

End Function 
+0

El problema con este método es que devolverá True para tablas vinculadas con un back-end no funcional. Usar DCount sería mucho más lento, pero más confiable. –

+2

Otro problema es que también parece encontrar formularios e informes ... ifTableExists ("myFormName") devuelve verdadero – Peter

+0

Gracias por su respuesta. Sabía acerca de la función dCount, pero no sabía cómo enviar una ** variable ** (tableName) a ella. Gracias. Un pequeño problema que puede causar errores: cambió el valor devuelto directamente cada vez. lo que debes hacer es 'dim b como Boolean b = False If ... b = True End If ifTableExists = b End Function' – MJH

10
Exists = IsObject(CurrentDb.TableDefs(tablename)) 
+0

¿cómo puedo usar esto? que utilizan este tipo, exists = IsObject (CurrentDb.TableDefs ("& ConctNmeforDB &")) MsgBox existe Después de eso, me quedo error de tiempo como 3265. No se ha encontrado en esta colección. – Karthik

+0

Hablando en términos prácticos, no puede usarlo solo. Tiene que estar envuelto en un manejador de errores para que devuelva falso cuando encuentre el error 3265. Ver http://stackoverflow.com/questions/2985513/check-if-access-table-exists/2992743#2992743 para 3 implementaciones diferentes de una función TableExists(). –

0

acceso tiene algún tipo de tablas del sistema You can read about it a little here puede disparar la consulta folowing para ver si existe (1 = existe, 0 = Eso no;))

SELECT Count([MSysObjects].[Name]) AS [Count] 
FROM MSysObjects 
WHERE (((MSysObjects.Name)="TblObject") AND ((MSysObjects.Type)=1)); 
+0

Eso perderá tablas vinculadas, tipo = 4. – Fionnuala

1

Esto no es una nueva pregunta. Lo dirigí al comments in one SO post, y publiqué my alternative implementations en otra publicación. Los comentarios en la primera publicación realmente dilucidan las diferencias de rendimiento entre las diferentes implementaciones.

Básicamente, lo que funciona más rápido depende del objeto de base de datos que utilice con él.

8

sé la pregunta ya está contestada, pero me parece que las respuestas existentes no son válidos:
que devolverá true para tablas vinculadas con un no back-end de trabajo.
El uso de DCount puede ser mucho más lento, pero es más confiable.

Function IsTable(sTblName As String) As Boolean 
    'does table exists and work ? 
    'note: finding the name in the TableDefs collection is not enough, 
    '  since the backend might be invalid or missing 

    On Error GoTo hell 
    Dim x 
    x = DCount("*", sTblName) 
    IsTable = True 
    Exit Function 
hell: 
    Debug.Print Now, sTblName, Err.Number, Err.Description 
    IsTable = False 

End Function 
Cuestiones relacionadas