Описание: Пример функций, которые проверяют наличие таблиц в базах данных, как в текущей, так и в удаленной.
Автор: Дмитрий Сонных (AKA Joss)
Добавил на сайт: Joss 16.01.2007
Периодически на форуме появляется вопрос типа: «Как проверить (определить) наличие конкретной таблицы в текущей (удаленной) базе данных?»
Я решил выложить пару функций, чтобы помочь решить эту проблему. Итак, приступим.
Проверка наличия таблицы в указанной базе данных. Метод ADO.
Не забудьте для использования метода ADO добавить в References Microsoft ADO Ext. for DDL and Security и Microsoft ActiveX Data Objects Library. Их версии зависят от версий Microsoft Access и обновлений, установленных на компьютере.
'---------------------------------------------------------------------------------------
' Procedure : IsTableADO, Release 2.0
' DateTime : 11.01.2007 16:59
' Author : DSonnyh
' Purpose : Проверка наличия таблицы в указанной базе данных
'---------------------------------------------------------------------------------------
'
Public Function IsTableADO(Name As String, strBase As String) As Integer
' проверка на наличие определенной таблицы. Метод ADO
' Name - наименование таблицы
' strBase - полный путь к файлу базы
Dim cnn As ADODB.Connection
Dim cat As ADOX.Catalog
Dim tdf As ADOX.Table
On Error GoTo IsTable_Error_ADO
Set cnn = New ADODB.Connection
Set cat = New ADOX.Catalog
Dim strProvider As String
' строка подклюбчения
strProvider = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=;" _
& "Data Source=" & strBase & ";Mode=Share Deny None;" _
& "Extended Properties=" & "''" & ";Jet OLEDB:System database=;Jet O"
If strBase = CurrentProject.FullName Then
cat.ActiveConnection = CurrentProject.Connection
Else
cnn.ConnectionString = strProvider
cnn.Open
cat.ActiveConnection = cnn.ConnectionString
End If
IsTableADO = 0
For Each tdf In cat.Tables
If tdf.Name = Name Then
IsTableADO = 1
Exit For 'Function
End If
Next tdf
Set tdf = Nothing
Set cat = Nothing
If strBase <> CurrentProject.FullName Then
cnn.Close
End If
Set cnn = Nothing
On Error GoTo 0
Exit_IsTable_ADO:
Exit Function
IsTable_Error_ADO:
MsgBox "Ошибка " & Err.Number & " (" & Err.Description & ") в процедуре IsTableADO"
Resume Exit_IsTable_ADO
End Function
И вторая функция. Предназначена для тех, кто до сих пор пользуется Access 97, или предпочитает метод DAO.
Проверка наличия таблицы в указанной базе данных. Метод DAO.
Не забудьте добавить в References ссылку на Microsoft DAO Object Library. Обычно она бывает версии 3.51 (A97) и 3.60 (A2000+).
'---------------------------------------------------------------------------------------
' Procedure : IsTableDAO, Release 2.0
' DateTime : 15.01.2007 10:39
' Author : DSonnyh
' Purpose : Проверка наличия таблицы в указанной базе данных
'---------------------------------------------------------------------------------------
'
Public Function IsTableDAO(Name As String, strBase As String) As Integer
' проверка на наличие определенной таблицы
' Name - наименование таблицы
' strBase - полный путь к файлу базы
On Error GoTo IsTableDAO_Error
Dim dbs As Database, tdf As TableDef
If strBase = CurrentDb.Name Then
Set dbs = CurrentDb
Else
Set dbs = DBEngine.Workspaces(0).OpenDatabase(strBase)
End If
IsTableDAO = 0
For Each tdf In dbs.TableDefs
If tdf.Name = Name Then
IsTableDAO = 1
Exit For
End If
Next tdf
Set tdf = Nothing
dbs.Close
Set dbs = Nothing
On Error GoTo 0
Exit_IsTableDAO:
Exit Function
IsTableDAO_Error:
MsgBox "Ошибка " & Err.Number & " (" & Err.Description & ") в процедуре IsTableDAO"
Resume Exit_IsTableDAO
End Function
И последняя функция. Я её написал для совместимости со своими старыми версиями и для того, чтобы облегчить переход с DAO на ADO (Если возникнет такое желание).
'---------------------------------------------------------------------------------------
' Procedure : IsTable, Release 2.0
' DateTime : 15.01.2007 13:28
' Author : DSonnyh
' Purpose : Вариант вызова фукции, используемый для совместимости со старыми версиями
'---------------------------------------------------------------------------------------
'
Public Function IsTable(Name As String, Optional strBase As Variant, _
Optional intMetod As Variant = 0) As Integer
' проверка на наличие определенной таблицы
' Name - наименование таблицы
' strBase - полный путь к файлу базы (опционально), по умолчанию - текущая
' intMetod - используемый метод 0 - DAO или 1 - ADO (опционально), по умолчанию - DAO
On Error GoTo IsTable_Error
Dim strBaseName As String, intMetodA As Integer
If IsMissing(strBase) Then
If intMetod = 0 Then
strBaseName = CurrentDb.Name
IsTable = IsTableDAO(Name, strBaseName)
Else
strBaseName = CurrentProject.FullName
IsTable = IsTableADO(Name, strBaseName)
End If
Else
strBaseName = strBase
If intMetod = 0 Then
IsTable = IsTableDAO(Name, strBaseName)
Else
IsTable = IsTableADO(Name, strBaseName)
End If
End If
On Error GoTo 0
Exit_IsTable:
Exit Function
IsTable_Error:
MsgBox "Ошибка " & Err.Number & " (" & Err.Description & ") в процедуре IsTable " _
& "в Module modConnect"
Resume Exit_IsTable
End Function
Замеченные недостатки и особенности функций. Определение наличия таблицы происходит при переборе коллекции TableDefs, поэтому скорость их работы невысока и зависит от числа элементов коллекции. У ADO в коллекцию входят все объекты базы: таблицы, запросы, макросы, формы, отчеты и т.д. Создание коллекции TableDefs для удаленной базы методом DAO происходит несколько медленнее, чем методом ADO.
Из справки для DAO: «…Для доступа к другой базе данных в то время, когда текущая база данных открыта в окне Microsoft Access, следует использовать метод OpenDatabase объекта Workspace. Метод OpenDatabase не открывает вторую базу данных в окне Microsoft Access, а возвращает переменную типа Database, представляющую вторую базу данных. Примечание. В предыдущей версии Microsoft Access для получения указателя на текущую базу данных можно было использовать следующий синтаксис: DBEngine.Workspaces(0).Databases(0) или DBEngine(0)(0). В Microsoft Access 2000 для этой цели следует использовать метод CurrentDb. Метод CurrentDb создает новый экземпляр текущей базы данных, а переменная DBEngine(0)(0) ссылается на открытую копию текущей базы данных. Метод CurrentDb позволяет создавать несколько переменных типа Database, ссылающихся на текущую базу данных. Синтаксис вида DBEngine(0)(0) по-прежнему поддерживается, но во избежание конфликтов в многопользовательских базах данных использовать его не рекомендуется.» Функции не различают прилинкованные таблицы и таблицы, находящиеся в базе. Если Вы хотите проверить на нахождение в базе данных целой группы таблиц, то для этого лучше написать отдельную функцию (я сейчас как раз такую функцию отлаживаю, и как появится возможность, то выложу).
Статьи с похожим содержанием: Форма для поиска объектов в базе данных. Получение списка таблиц другой Базы данных (MSA 2000)
[Back]
|