我正在尝试将一些参数传递给我的经典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
答案 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
常量包含文件(METADATA
或global.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,这意味着代码不知道adCmdStoredProc
,adParamInput
等常量(因此它们始终为0)。
您可以查找它们并在代码中定义所需的常量(或直接使用数字,但如果稍后再次编辑代码则不能很好地读取)。
或者看看here on msdn - 您可能会找到一个定义所有常量的文件
c:\Program Files\Common Files\System\ado\adovbc.inc
。