【问题标题】:Can't pass a string to a stored procedure无法将字符串传递给存储过程
【发布时间】:2017-03-21 13:11:52
【问题描述】:

这是我的存储过程...

alter PROCEDURE ReplyToEmailConfirmation 
    @uniqueKey varchar(36)
AS
BEGIN

Print 'Hello World!'
END

这是代码...

Set cmd = Server.CreateObject("ADODB.Command")
With cmd
    .ActiveConnection = getConfigValue("ASPClassicConnectionString")
    .CommandType = adCmdStoredProc
    .CommandText = "[ReplyToEmailConfirmation]"

    .Parameters.Append .CreateParameter("@uniqueKey", adVarChar, adParamInput, 36, "dc8d8bfd-ea3a-4ad9-9f2d-92831eb2655a")

End With

cmd.Execute

这是错误...

ADODB.Command 错误“800a0bb9”

参数类型错误、超出可接受范围或 互相冲突。

如何让它工作?目的是使用adGUID,但我想我会尝试adVarChar 来缩小错误范围。

【问题讨论】:

  • 好像可以用.Parameters.Refreshmsdn.microsoft.com/en-us/library/ms676516自动填写存储过程中的参数信息
  • @Slai 不要那样做,需要额外去服务器拉取参数信息,不推荐。
  • 您的CreateParameter() 方法中缺少Size 参数,请尝试.Parameters.Append .CreateParameter("@uniqueKey", adVarChar, adParamInput, 100)。还可以尝试通过设置.CommandType = adCmdStoredProc 告诉 ADODB 您正在执行存储过程。

标签: stored-procedures vbscript asp-classic adodb


【解决方案1】:

如果你read the documentation for CreateParameter()一切都变得清晰了;

如果在 Type 参数中指定可变长度数据类型,则必须在将其附加到 Parameters 集合之前传递 Size 参数或设置 Parameter 对象的 Size 属性;否则会出错。

当您传递 VARCHAR 这是一个 "variable-length" 数据类型时,您必须在调用 CreateParameter() 时指定 Size

Dim cmd

Set cmd = Server.CreateObject("ADODB.Command")
With cmd
    'Let the cmd deal with the connection.
    .ActiveConnection = getConfigValue("ASPClassicConnectionString")
    .CommandText = "[ReplyToEmailConfirmation]"
    .CommandType = adCmdStoredProc
    Call .Parameters.Append(.CreateParameter("@uniqueKey", adVarChar, adParamInput, 100))
    .Parameters("@uniqueKey") = "dc8d8bfd-ea3a-4ad9-9f2d-92831eb2655a"
End With
Call cmd.Execute()

'Tidy up memory
Set cmd = Nothing

还包括adCmdStoredProc 中的CommandType,它告诉ADO 将此命令解释为存储过程调用,没有它默认为adCmdUnknown,这意味着ADO 必须尝试确定该命令是什么,无论多么小不必要的开销。

也不喜欢实例化ADODB.Connection 对象只是为了执行ADO.Command 对象,这意味着您必须自己管理关闭ADODB.Connection。而是让ADODB.Command 为你做这件事,通过传递一个连接字符串让它创建连接并自行销毁它。假设getConfigValue("ASPClassicConnectionString") 返回一个连接字符串,您可以将其直接传递给ActiveConnectionADODB.Command 将实例化连接并处理它。


有用的链接

【讨论】:

  • 我已经尝试过 size 参数,但也没有用。我已经更新了问题。
  • 另外,我删除了.CommandType = adCmdStoredProc,因为它似乎导致了同样的错误。
  • 其实如果我去掉两端的参数,设置命令类型会导致这个错误。
  • @IanWarburton 是的,正如您推测的那样,您需要使用 Const name = value 手动定义或使用 METADATA (请参阅答案中的链接) 定义 ADODB 命名常量来导入类型整个 Web 应用程序的库,无需再次定义它们。
【解决方案2】:

我没有为adCmdStoredProcadVarCharadGUID 常量添加adovbs.inc。呵呵。

【讨论】:

  • 您在 Classic ASP 中使用它吗? VBScript 不支持包含,如果您考虑使用METADATA 方法。
  • 是的,经典 ASP。通过包含,我的意思是...<!--#include virtual="/include/adovbs.asp"-->.
  • 在问题中添加asp-classic 标记会很有帮助,以便我们了解上下文。如果我意识到会在我的回答中包含有关使用METADATA 的信息。
  • 那个标签在问题上!还是你添加的?
  • 有很多,VBScript 被用作许多不同主机的脚本语言。但您通常可以在大多数基于 Windows 操作系统的计算机上使用 cscript.exewscript.exe 调用它。是的,我添加了您可以看到的标签the revision here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
相关资源
最近更新 更多