2011-01-27 53 views
2

如果我調用存儲過程由正確的方式來傳遞的字符串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'") 

沒有幫助。

任何關於傳遞參數的正確方法的幫助將會很棒!

感謝

回答

3

我注意到你在遺漏呼叫的@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; 
相關問題