我正试图使用ADODB 2.0库从Excel VBA执行MSSQL存储过程(也尝试过2.8,但存在相同问题)其发送结果集以及返回值。我能够正确地获得结果集值,但无法获得返回值(总是将返回值作为空值)
以下是用于此目的的VBA过程,它采用以下参数:db connection, sp name, parameter values string array, db result set, spretval
——最后两个是输出参数
Private Sub execSQLSP(dbcon, spname, paramStrInArray, ByRef dbrs, ByRef spretval)
Dim cmd As ADODB.Command
Dim dberrflag As Integer
Dim dberrdesc As String
Dim ndx As Long
Dim paramname As String
On Error Resume Next
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = dbcon
cmd.CommandText = spname
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Append cmd.CreateParameter("retVal", adInteger, _
adParamReturnValue)
For ndx = 0 To UBound(paramStrInArray)
paramname = "param" & ndx
cmd.Parameters.Append cmd.CreateParameter(Name:=paramname, _
Type:=adVarChar, Direction:=adParamInput, _
size:=Len(paramStrInArray(ndx)), _
Value:=paramStrInArray(ndx))
Next
Set dbrs = cmd.Execute
Call getDBerror(dbcon.Errors, dberrflag, dberrdesc)
If dberrflag = 1 Then
MsgBox "DB Error while executing following SQL command and hence stopping." & vbCrLf & _
"SQL Cmd:" & spname & vbCrLf & _
"DB Err.:" & dberrdesc, vbCritical, appnameversion
cleanup
End
End If
spretval = cmd.Parameters("retVal").Value
MsgBox cmd.Parameters("retVal")
End Sub
执行此VBA过程后,获取结果集,使用该结果集可以正确地获取结果集值,但不能返回值。我只得到空值(实际上SP返回10)
存储过程包含一些将数据插入临时表的处理,最后通过select命令返回临时表中的所有行,然后返回值。
此代码可能有什么问题?
在关闭记录集对象后查询返回值时,我设法获得了返回值。
显然,仅仅阅读记录集是不够的;还需要关闭记录集对象,以便在命令对象中填充返回值和参数值。我在ADO文档中找不到这个。
看起来这可能是一个ADO设计问题,命令对象返回/参数值只有在记录集对象关闭后才被填充。