関数からレコードセットを返す方法
質問
私は、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を呼び出すことはできませんメソッドを実行します。
所属していません StackOverflow