web-dev-qa-db-ja.com

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
16
whytheq

ADO Recordsetには.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チェックに失敗する可能性があるためです。

編集2:

参照されるActiveXデータオブジェクトなしの遅延バインディングの場合、オプションはほとんどありません。 ObjectStateEnum のadStateOpen定数の値を使用します

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
30
Raybarg

このトピックは古いですが、私のような他の人が解決策を探している場合、これは私が見つけた解決策です:

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」はデータベースオブジェクトです。データベースにアクセスするクラス(挿入、更新などのクラス)を作成し、モジュールでクラスを使用してオブジェクトを宣言し(明らかに)、接続をテストできます。 「[オブジェクト] .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では「.Close」と「set myBase = nothing」を使用します。編集2:関数で、接続していない場合、.versionでエラーが発生するため、接続しない場合、errorHandlerはfalseを提供します

0
JustGuest