使用ASP将参数传递给存储过程

时间:2014-11-05 19:51:34

标签: vbscript asp-classic adodb

我正在尝试将一些参数传递给我的经典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

我收到了错误

Arguments are of the wrong type, are out of acceptable range, or are in conflict 
with one another.

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

3 个答案:

答案 0 :(得分:1)

@KekuSemau is correct但是,让我建议一种更有效,更易于管理的方法,然后使用adovbs常量文件。

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

要使用它,只需将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属性应该完全相同。

  

重要:

     

adovbs中使用adovbs.inc方法时,请务必删除对adovbs.asp常量包含文件(METADATAglobal.asa)的任何引用,否则您将获得一个

Name redefined error
     

此外,METADATA仅适用于IIS 4.0及更高版本。


有用的链接

答案 1 :(得分:0)

我认为只有一小部分你做错了:

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属性进行分配。

答案 2 :(得分:-1)

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

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

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