【问题标题】:Passing Parameters to a Stored Procedure using ASP使用 ASP 将参数传递给存储过程
【发布时间】:2015-01-02 03:43:02
【问题描述】:

我正在尝试将一些参数传递给我的经典 ASP 中的 SQL 存储过程。我已经看过几篇关于此的帖子,但不确定我做错了什么,因为我似乎没有看到我的差异。

set conn = CreateObject("ADODB.Connection") 
conn.open ("DSN=SERVER;UID=username;PWD=pwd;Database=MyDatabase")

 set cmd = Server.CreateObject("ADODB.Command")
 set cmd.ActiveConnection = conn
 cmd.CommandType = adCmdStoredProc
 cmd.CommandText = my_proc
 cmd.Parameters.Refresh
 cmd.Parameters(1) = "MyParam"

set rs = cmd.execute

我收到了错误

参数类型错误、超出可接受范围或存在冲突 彼此。

在线cmd.CommandType = adCmdStoredProc。我也尝试按照以下方式进行操作,但出现相同的错误

set conn = CreateObject("ADODB.Connection") 
conn.open ("DSN=SERVER;UID=username;PWD=pwd;Database=MyDatabase")

 set cmd = Server.CreateObject("ADODB.Command")
 set cmd.ActiveConnection = conn
 cmd.CommandType = adCmdStoredProc
 cmd.CommandText = my_proc
 cmd.Parameters.Refresh
 cmd.Parameters.Append cmd.CreateParameter("@MyParam, adVarWChar, adParamInput, 50, "test")

set rs = cmd.execute

【问题讨论】:

    标签: vbscript asp-classic adodb


    【解决方案1】:

    @KekuSemauis correct 但让我建议一种比使用adovbs 常量文件更有效和更易于管理的方法。

    METADATA 允许您定义对 DLL 常量的引用,即使您在经典 ASP 环境中使用后期绑定也是如此。可能值得一提的是,您可以在各个页面中添加元数据引用,但又为什么要这样做?

    要使用它,只需将 METADATA 标记添加到您的 global.asa 文件(应该位于 Web 应用程序的根目录中)。

    <!-- 
    METADATA TYPE="typelib" FILE="C:\Program Files\Common Files\System\ADO\msado20.tlb"
    -->
    

    根据系统的不同,ADO 类型库可能会有所不同,请相应调整FILE 属性。

    我在所有应用程序中都使用这种方法,主要是为了引用 ADO 和 CDO 类型库中的常量。

    ADO 类型库

    <!--
    METADATA 
    TYPE="typelib" 
    FILE="c:\program files\common files\system\ado\msado15.dll"
    -->
    

    CDO 类型库

    <!-- 
    METADATA 
    TYPE="typelib" 
    UUID="CD000000-8B95-11D1-82DB-00C04FB1625D" 
    NAME="CDO for Windows 2000 Library"
    -->
    

    这些是我个人参考的例子,文件位置可能不同,而UUID 属性应该完全相同。

    重要提示:

    在您的global.asa 中使用METADATA 方法时,请记住删除对adovbs 常量包含文件(通常为adovbs.incadovbs.asp)的任何引用,否则您将得到一个

    名称重定义错误

    此外,METADATA 仅在 IIS 4.0 及更高版本中可用。


    有用的链接

    【讨论】:

    • 也适用于 ADO &lt;!--METADATA TYPE="typelib" NAME="Microsoft ActiveX Data Objects 2.8 Library" UUID="{2A75196C-D9EB-4129-B803-931327F72D5C}" VERSION="2.8"--&gt;
    • @AlexK。是的,您可以使用FILEUUID 来引用类型库。
    【解决方案2】:

    您通过late binding 使用ADO,这意味着您的代码不知道adCmdStoredProcadParamInput 等常量(因此它们始终为0)。

    您可以查找它们并将所需的那些定义为代码中的常量(或直接使用数字,但如果您稍后再次编辑代码,则可读性不好)。

    或查看here on msdn - 您可能会在
    c:\Program Files\Common Files\System\ado\adovbc.inc 找到定义所有常量的文件。

    【讨论】:

    • 谢谢,正是我需要的。
    • @doby48 不,不要这样做,使用adovbc.incMETA Type Library references 的不良替代品。添加的 META 类型库引用只有一次(因为它已添加到经典 ASP 应用程序中的 global.asa),而 adovbc.inc 必须包含在每个页面中或设置在另一个 #include 文件中以全局应用它。
    【解决方案3】:

    我认为你做错的只是很小的一部分:

    set conn = CreateObject("ADODB.Connection") 
    conn.open ("DSN=SERVER;UID=username;PWD=pwd;Database=MyDatabase")
    
    set cmd = Server.CreateObject("ADODB.Command")
    set cmd.ActiveConnection = conn
    cmd.CommandType = 4 ' adCmdStoredProc constant is not defined in your context
    cmd.CommandText = my_proc
    cmd.Parameters.Refresh
    cmd.Parameters(1).value = "MyParam"
    
    set rs = cmd.execute
    

    ADO 常量可能未定义,而且(但不确定)参数应该通过其value 属性分配。

    【讨论】:

    • 这将不起作用,因为集合中尚未定义Parameters(1)(使用.CreateParameter() 定义它),而且.Parameters 集合是从0 开始的序数。跨度>
    • .Refresh 从服务器获取参数并添加到.Parameters 集合中
    • 抱歉错过了。过去,我与 Refresh 的结果喜忧参半,我更愿意自己声明。
    • 另外值得注意的是,Refresh 不建议用于生产环境,因为它需要再次往返服务器才能完成调用并拉回参数定义。
    猜你喜欢
    • 2021-02-17
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多