以字符串形式传递给CreateParameter的正确方法

时间:2011-01-27 17:57:54

标签: sql vb6

如果我通过

调用存储过程
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'")

无济于事。

关于传递参数的正确方法的任何帮助都会很棒!

由于

1 个答案:

答案 0 :(得分:3)

我注意到您在调用中省略了@proposalNo参数。因此,我认为您需要标记您正在使用命名参数,否则将假定它们处于顺序位置顺序,即调用中的@groupNoParameters集合中的第三个,因此将是用于存储过程中的第三个参数,实际上是@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