0

Excel VBA から SQL Server ストアド プロシージャを実行しようとしています。このプロシージャは、行を結果セット オブジェクトに返します。ただし、コードの実行中にエラーがスローされます。

3704 オブジェクトが閉じているときは操作できません

注:同じ接続オブジェクトで実行されているクエリは正常に動作している
ため、データベース接続に問題はありません。Select

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Dim prm As ADODB.Parameter
Dim rst As New ADODB.Recordset

Set cn = New ADODB.Connection
Set cmd = New ADODB.Command
ThisWorkbook.initialize
cn.Provider = "sqloledb"
cn.Properties("Data Source").Value = ThisWorkbook.server
cn.Properties("Initial Catalog").Value = ThisWorkbook.db
cn.Properties("User ID").Value = "xxxxx"
cn.Properties("Password").Value = "xxxxx"
cn.Open

Set cmd = New ADODB.Command
cmd.CommandText = "Generate_KPI_Process_Quality_Check_RunTime"
cmd.CommandType = adCmdStoredProc
cmd.ActiveConnection = cn

Set prm = cmd.CreateParameter("@currentMonth", adChar, adParamInput, 255, cmb_month.Value)
cmd.Parameters.Append prm

Set prm = cmd.CreateParameter("@center", adChar, adParamInput, 255, cmb_center.Value)
cmd.Parameters.Append prm

rst.CursorType = adOpenStatic
rst.CursorLocation = adUseClient
rst.CursorLocation = adUseServer
rst.LockType = adLockOptimistic

rst.Open cmd

If (rst.BOF And rst.EOF) Then
'Some Code
End If
4

4 に答える 4

3

置く

SET NOCOUNT ON

ストアド プロシージャで -- これにより、「1 レコードが更新されました」のような出力テキストの生成が防止されます。

于 2014-03-06T16:00:29.603 に答える
1

Set キーワードを使用してオブジェクトを割り当てます。

Set cmd.ActiveConnection = cn

それ以外の場合は、Connection オブジェクト自体の代わりに、Connection オブジェクトの既定のプロパティ (たまたま接続文字列) が割り当てられます。

于 2013-08-28T12:59:05.253 に答える
1

Openのメソッドにさらにパラメーターを指定する必要がありますRecordset Object

試すrst.Open cmd, cn

于 2013-08-28T12:55:30.303 に答える
0

結果セットを含む別のレコードセットを置くだけです

Dim rst1 As New ADODB.Recordset
SET rst1=rst.NextRecordset 'this will return the first resultset

If rst1.BOF or rst1.EOF Then...
    'some code
End If
于 2015-09-23T14:50:14.733 に答える