gpt4 book ai didi

sql - 将字符串作为字符串传递给 CreateParameter 的正确方法

转载 作者:行者123 更新时间:2023-12-04 06:36:26 25 4
gpt4 key购买 nike

如果我调用存储过程

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集合,因此将用于存储过程中的第三个参数,实际上是 @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引擎在 NamedParameters时使用参数的顺序位置未启用。

更新:

也许这个存储过程使用上面相同的 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;

关于sql - 将字符串作为字符串传递给 CreateParameter 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4820014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com