正确的方式来传递的字符串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;