正确的方式来传递的字符串CreateParameter
问题描述:
如果我调用存储过程由正确的方式来传递的字符串CreateParameter
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])
[全球尺寸代码1]是一个varchar(20)
我也曾尝试
cmd.Parameters.Append cmd.CreateParameter("@groupNo", adVarChar, adParamInput, 4, "'02'")
没有帮助。
任何关于传递参数的正确方法的帮助将会很棒!
感谢
答
我注意到你在遗漏呼叫的@proposalNo
参数。因此,我认为您需要标记您使用的是已命名的参数,否则它们将被假定为顺序位置顺序,即@groupNo
中的呼叫是Parameters
集合中的第三个,因此将用于存储中的第三个参数proc实际上是@proposalNo
。
尝试立即cmd.Parameters.Append...
行之前插入此行
cmd.NamedParameters = True
。请注意,只有更高版本的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>
在消息箱中切换位置,证明当没有启用NamedParameters
时,SQL引擎使用参数的序号位置。
更新:
这也许存储的过程给出了上述同样的VBA代码更明确的结果:
ALTER PROCEDURE [dbo].[GetValueProc]
@startDate as date,
@endDate as date,
@proposalNo nvarchar(30) = null,
@groupNo nvarchar(3) = null
AS
BEGIN
SELECT '@proposalNo = ' + COALESCE(@proposalNo, '<NULL>') + CHAR(10)
+ '@groupNo = ' + COALESCE(@groupNo, '<NULL>');
END;