質問

私は、Excel VBAでのデータアクセス層を構築し、トラブルレコードセットを返すを抱えています。私のクラスの実行()関数は、間違いなく、データベースから行を取得しているが、何かを返すされていないようです。

次の関数はDataAccessLayerというクラスに含まれています。クラス接続を開閉処理機能接続および切断が含まれています。


Public Function Execute(ByVal sqlQuery As String) As ADODB.recordset
    Dim rs As ADODB.recordset
    Set rs = New ADODB.recordset
    Dim recordsAffected As Long

    ' Make sure we're connected to the database.
    If Connect Then
        Set command = New ADODB.command

        With command
            .ActiveConnection = connection
            .CommandText = sqlQuery
            .CommandType = adCmdText
        End With

        'Set rs = command.Execute(recordsAffected)
        'Set Execute = command.Execute(recordsAffected)
        rs.Open command.Execute(recordsAffected)
        rs.ActiveConnection = Nothing
        Set Execute = rs
        Set command = Nothing
        Call Disconnect
    End If
End Function

ここで私はテストのために私のスプレッドシートのセルA1に使用しているパブリック関数です。


Public Function Scott_Test()
    Dim Database As New DataAccessLayer
    'Dim rs As ADODB.recordset
    'Set rs = CreateObject("ADODB.Recordset")
    Set rs = New ADODB.recordset

    Set rs = Database.Execute("SELECT item_desc_1 FROM imitmidx_sql WHERE item_no = '11001'")
    'rs.Open Database.Execute("SELECT item_desc_1 FROM imitmidx_sql WHERE item_no = '11001'")
    'rs.Open

    ' This never displays.
    MsgBox rs.EOF

    If Not rs.EOF Then
        ' This is displaying #VALUE! in cell A1.
        Scott_Test = rs!item_desc_1
        rs.Close
    End If

    rs.ActiveConnection = Nothing
    Set rs = Nothing
End Function

私が間違って何をしているのですか?

役に立ちましたか?

解決

問題がのActiveConnection =何も設定しないとしました。次のコードは動作します:

Public Function Execute(ByVal sqlQuery As String) As ADODB.recordset
    Dim rs As ADODB.recordset
    Set rs = New ADODB.recordset
    Dim recordsAffected As Long

    ' Make sure we are connected to the database.
    If Connect Then
        Set command = New ADODB.command

        With command
            .ActiveConnection = connection
            .CommandText = sqlQuery
            .CommandType = adCmdText
        End With

        rs.Open command.Execute(recordsAffected)

        Set Execute = rs
        Set command = Nothing
        Call Disconnect
    End If
End Function

他のヒント

Set Execute = recordset

は、機能を終了するに閉じるレコードセットへのポインタを作成します。
それが何かを含めることはできませんThatsなぜだ。

私は予約語(レコード)をpossibeと同一であるあなたの変数名にもrelectantいます。私は一般的に、RSまたはRSINまたはrsWhateverYouWant ...

を使用します
パトリックによって、上述したように、

、レコードポインタです。 発信者Scott_Testは 'の代わりにrecordset.Closeを呼び出す必要があります。

しかし、私はrecordset.ActiveConnection =何もを残すことがOKであると信じて、recordset.Closeを呼び出すことはできませんメソッドを実行します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top