如果我通过
调用存储过程DECLARE @return_value int
EXEC @return_value = [dbo].[GetValueProc]
@startDate = '1/1/2010',
@endDate = '12/31/2010',
@groupNo = N'02'
SELECT 'Return Value' = @return_value
从sql命令窗口可以很好地工作,但是使用VB6它会返回一个空的记录集。
Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = cn
cmd.CommandText = "GetValueProc"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Append cmd.CreateParameter("@startDate", adDate, adParamInput, 0, startDate)
cmd.Parameters.Append cmd.CreateParameter("@endDate", adDate, adParamInput, 0, endDate)
cmd.Parameters.Append cmd.CreateParameter("@groupNo", adVarChar, adParamInput, 3, "02")
Set RstRecordSet = New ADODB.Recordset
With RstRecordSet
.CursorType = adOpenStatic
.CursorLocation = adUseClient
.LockType = adLockOptimistic
.Open cmd
End With
我从vb获得一个空记录集。但是,从sql命令窗口,它按预期工作。
注意:如果我用相关参数注释掉该行,它也会按预期工作。
存储过程如下:
ALTER PROCEDURE [dbo].[GetValueProc]
@startDate as date,
@endDate as date,
@proposalNo nvarchar(30) = null,
@groupNo nvarchar(3) = null
select...
where ...
and j.[Global Dimension 1 Code] = COALESCE(@groupNo,[Global Dimension 1 Code])
[Global Dimension 1 Code]是varchar(20)
我也试过
cmd.Parameters.Append cmd.CreateParameter("@groupNo", adVarChar, adParamInput, 4, "'02'")
无济于事。
关于传递参数的正确方法的任何帮助都会很棒!
由于
答案 0 :(得分:3)
我注意到您在调用中省略了@proposalNo
参数。因此,我认为您需要标记您正在使用命名参数,否则将假定它们处于顺序位置顺序,即调用中的@groupNo
是Parameters
集合中的第三个,因此将是用于存储过程中的第三个参数,实际上是@proposalNo
。
尝试插入此行
cmd.NamedParameters = True
紧接cmd.Parameters.Append...
行之前。请注意,只有更高版本的ADO(例如2.8)支持命名参数。
这是一个复制品:
首先,更改您的存储过程以简单地选择参数,例如
ALTER PROCEDURE [dbo].[GetValueProc]
@startDate as date,
@endDate as date,
@proposalNo nvarchar(30) = null,
@groupNo nvarchar(3) = null
AS
BEGIN
SELECT @startDate, @endDate, @proposalNo, @groupNo;
END;
其次,试试这个VBA(需要为你的连接字符串编辑它)来纠正你的拼写错误:
Sub hngorhio()
Dim cmd As New ADODB.Command
Set cmd = New ADODB.Command
cmd.ActiveConnection = "Your connection string here"
cmd.CommandText = "GetValueProc"
cmd.CommandType = adCmdStoredProc
cmd.NamedParameters = True ' <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< '
cmd.Parameters.Append _
cmd.CreateParameter("@startDate", adDate, adParamInput, 0, Date)
cmd.Parameters.Append _
cmd.CreateParameter("@endDate", adDate, adParamInput, 0, Date + 1)
cmd.Parameters.Append _
cmd.CreateParameter("@groupNo", adVarChar, adParamInput, 3, "02")
Dim RstRecordSet As New ADODB.Recordset
Set RstRecordSet = New ADODB.Recordset
With RstRecordSet
.CursorType = adOpenStatic
.CursorLocation = adUseClient
.LockType = adLockOptimistic
.Open cmd
If Not .EOF Then
MsgBox .GetString(, , , , "<NULL>")
End If
End With
End Sub
如果您评论并取消注释NamedParameters
行,您会在消息框中看到02
和<NULL>
切换位置,证明SQL引擎在{时使用参数的序号位置{1}}未启用。
更新:
也许这个存储过程使用上面相同的VBA代码给出了更明确的结果:
NamedParameters