尝试使用预准备语句调用存储过程时出错

时间:2014-02-11 00:10:23

标签: sql stored-procedures vbscript asp-classic adodb

我正在尝试使用预准备语句来调用存储过程(使用ADODB和经典ASP),但是当我设置CommandType时,我收到以下错误:

  

ADODB.Command错误'800a0bb9'

     

参数类型错误,超出可接受的范围,或彼此冲突。

我有以下代码:

With Server.CreateObject("ADODB.Command")
    .ActiveConnection = db 'this is initialized prior
    .CommandType = adCmdStoredProc
    .CommandText = "procName"
End With

准备好的语句名称是正确的(我只能通过执行字符串来调用它),如果我省略.CommandType并尝试调用.Execute,我会收到错误指定:

  

过程或函数'procName'需要参数'@ParamName',这是未提供的。

即使我省略了CommandType,我也不知道如何实际添加参数(以下几行只会导致关于错误类型参数的原始错误):

.Parameters.Append .CreateParameter("@ParamName",adVarChar,adParamInput,50,param)

我也尝试过以下操作并收到错误“无法在与所请求的名称或序号对应的集合中找到项目。”

.Parameters.Refresh
.Parameters(0) = param

我已经看过几个如何使用预处理语句调用存储过程的示例,看起来我正在使用正确的语法,但我尝试的任何东西似乎都会导致某种错误。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

你想要这样的东西(未经测试)

Dim cmd, rs, ars, conn

Set cmd = Server.CreateObject("ADODB.Command")

With cmd
  'Assuming passing connection string if passing ADODB.Connection object
  'make sure you use Set .ActiveConnection = conn also conn.Open should
  'have been already called.
  .ActiveConnection = conn
  'adCmdStoredProc is Constant value for 4 (include adovbs or 
  'set typelib in global.asa)
  .CommandType = adCmdStoredProc
  .CommandText = "dbo.procName"
  'Define parameters in ordinal order to avoid errors
  Call .Parameters.Append(.CreateParameter("@ParamName", adVarChar, adParamInput, 50))

  'Set values using parameter friendly name
  .Parameters("@ParamName").Value = param

  'Are you returning a recordset?
  Set rs = .Execute()
  'Populate array with data from recordset
  If Not rs.EOF Then ars = rs.GetRows()
  Call rs.Close()
  Set rs = Nothing
End With
Set cmd = Nothing

重要的是要记住友好名称(因为我的规则我倾向于将我的存储过程中的参数名称与ADO中的友好名称相匹配),您给出的参数对存储没有任何意义程序,因为ADO通常传递参数,仅此而已,你得到错误的事实;

  

过程或函数'procName'需要参数'@ParamName',这是未提供的。

建议存储过程期望您的@ParamName参数(在您的存储过程中定义)值从ADO以不同的序号位置传递,这通常意味着您没有定义所有参数或传递了所有参数值他们期望的位置。

如果您对序数定位和参数要求有信心,也可以缩短版本

With cmd
  .ActiveConnection = conn
  .CommandType = adCmdStoredProc
  .CommandText = "dbo.procName"

  'Pass parameters as array following ordinal position.
  Set rs = .Execute(, Array(param))
  'Populate array with data from recordset
  If Not rs.EOF Then ars = rs.GetRows()
  Call rs.Close()
  Set rs = Nothing
End With
Set cmd = Nothing

使用二维数组很容易,并且可以消除直接使用ADODB.Recordset的开销。

Dim row, rows

If IsArray(ars) Then
  rows = UBound(ars, 2)
  For row = 0 To rows
    Response.Write "First column from row " & row & " = " & ars(0, row) & "<br />"
  Next
Else
  Response.Write "No data to return"
End If

<强>链接

答案 1 :(得分:0)

以下是在ASP classic中调用存储过程的方法:

'Set the connection
'...............

'Set the command
DIM cmd
SET cmd = Server.CreateObject("ADODB.Command")
SET cmd.ActiveConnection = Connection

'Set the record set
DIM RS
SET RS = Server.CreateObject("ADODB.recordset")

'Prepare the stored procedure
cmd.CommandText = "procName"
cmd.CommandType = 4  'adCmdStoredProc

'Assign value to the parameter
cmd.Parameters("@ParamName ") = ParamValue 

'Execute the stored procedure
RS = cmd.Execute
SET cmd = Nothing

'You can now access the record set
if (not RS.EOF) THEN
    data = RS("column_name")
end if

'dispose your objects
RS.Close
SET RS = Nothing

Connection.Close
SET Connection = Nothing