Проверьте, открыто ли соединение ADODB
Я использую следующие процедуры excel для установления соединения с нашей базой данных.
Private Const strConn As String = _
"PROVIDER=SQLOLEDB.1 ..."
Sub OpenConnection()
Set cn = CreateObject("ADODB.Connection")
cn.Open strConn
cn.CommandTimeout = 0
Set rs = CreateObject("ADODB.Recordset")
Set rs.ActiveConnection = cn
End Sub
В последующем коде я открываю соединение, используя различные строки SQL.
Я хотел бы проверить, открыт ли rs
, поэтому я знаю, что он должен быть закрыт, но следующее не работает. Как я могу изменить условие в следующем, чтобы работать?
If (rs.Open = True) Then
rs.Close
End If
Следующие работы, но я бы не хотел использовать ловушку ошибок таким образом:
On Error Resume Next
rs.Close
2 ответа:
Набор записей ADO имеет свойство
.State
, Вы можете проверить, является ли его значениеadStateClosed
илиadStateOpen
If Not (rs Is Nothing) Then If (rs.State And adStateOpen) = adStateOpen Then rs.Close Set rs = Nothing End If
MSDN о государственном имуществе
Править; Причина не проверять
.State
против 1 или 0 заключается в том, что даже если он работает 99,99% времени, все еще возможно установить другие флаги, которые приведут к тому, что оператор If не выполнит проверкуadStateOpen
.Edit2:
Для поздней привязки Без объектов данных ActiveX, на которые ссылаются, у вас есть несколько вариантов. Используйте значение adstateopen константа из ObjectStateEnum
If Not (rs Is Nothing) Then If (rs.State And 1) = 1 Then rs.Close Set rs = Nothing End If
Или вы можете сами определить константу, чтобы сделать ваш код более читаемым (определение их всех для хорошего примера.)
Const adStateClosed As Long = 0 'Indicates that the object is closed. Const adStateOpen As Long = 1 'Indicates that the object is open. Const adStateConnecting As Long = 2 'Indicates that the object is connecting. Const adStateExecuting As Long = 4 'Indicates that the object is executing a command. Const adStateFetching As Long = 8 'Indicates that the rows of the object are being retrieved. [...] If Not (rs Is Nothing) Then ' ex. If (0001 And 0001) = 0001 (only open flag) -> true ' ex. If (1001 And 0001) = 0001 (open and retrieve) -> true ' This second example means it is open, but its value is not 1 ' and If rs.State = 1 -> false, even though it is open If (rs.State And adStateOpen) = adStateOpen Then rs.Close End If Set rs = Nothing End If
Эта тема стара, но если другие люди, такие как я, ищут решение, это решение, которое я нашел:
Public Function DBStats() As Boolean On Error GoTo errorHandler If Not IsNull(myBase.Version) Then DBStats = True End If Exit Function errorHandler: DBStats = False End Function
Итак, "myBase" - это объект базы данных, я создал класс для доступа к базе данных (класс с insert, update и т. д...) и на модуле класс используется объявить в объекте (очевидно), и я могу проверить связь с "[объект].DBStats":
Dim BaseAccess As New myClass BaseAccess.DBOpen 'I open connection Debug.Print BaseAccess.DBStats ' I test and that tell me true BaseAccess.DBClose ' I close the connection Debug.Print BaseAccess.DBStats ' I test and tell me false
Редактировать : в DBOpen я использую "OpenDatabase" и в DBClose я использую ".Закрыть " и " установить myBase = ничего" Правка 2: в функция, если вы не подключаетесь, .версия выдаст вам ошибку, так что если вы не подключены, errorHandler выдаст вам false