重用ADODB.Command的正确方法

fee*_*wet 2 vbscript adodb

在循环内调用存储的正确方法是什么?

如果我这样输入:

Connection = CreateObject("ADODB.Connection")
DO UNTIL RS.EOF
    SET cmd = Server.CreateObject ("ADODB.Command")
    cmd.ActiveConnection = Connection
    cmd.CommandText = "spMySproc"
    cmd.CommandType = adCmdStoredProc
    cmd.Parameters.Append cmd.CreateParameter ("@p1",adInteger,adParamInput, ,RS("Val1"))
    cmd.Parameters.Append cmd.CreateParameter ("@p2",adInteger,adParamInput, ,RS("Val2"))
    cmd.Execute
    SET cmd = nothing
LOOP
Run Code Online (Sandbox Code Playgroud)

然后在循环的第二次和后续迭代中,我得到一个错误

过程或函数spMySproc指定的参数过多。

Kul*_*gin 5

您需要将命令准备和循环分开。然后,您可以多次使用Parameters集合来执行命令。

'preparing command
Set cmd = CreateObject ("ADODB.Command")
    cmd.ActiveConnection = Connection
    cmd.CommandText = "spMySproc"
    cmd.CommandType = adCmdStoredProc
    cmd.Parameters.Append cmd.CreateParameter("@p1", adInteger, adParamInput,,0) '0 as placeholder
    cmd.Parameters.Append cmd.CreateParameter("@p2", adInteger, adParamInput,,0) '0 as placeholder

Do Until Rs.Eof
    cmd.Parameters("@p1").Value = Rs("Val1").Value
    cmd.Parameters("@p2").Value = Rs("Val2").Value
    cmd.Execute
    Rs.MoveNext
Loop
Run Code Online (Sandbox Code Playgroud)

  • @Lankymart-是的。如果有人在五年前告诉我,我会在2016年修补ASP Classic系统,我会哭。但是由于工作量超过时间或金钱,所以我已经习惯了哭泣;) (3认同)
  • @feetwet [Server](https://msdn.microsoft.com/zh-cn/library/ms525541%28v=vs.90%29.aspx)是一个ASP(IIS)对象,具有[Server.CreateObject]( https://msdn.microsoft.com/zh-CN/library/ms524786%28v=vs.90%29.aspx)方法。[WScript](https://msdn.microsoft.com/zh-cn/library/at5ydy31%28v%3Dvs.84%29.aspx)是Windows脚本宿主的根对象,也具有[WScript.CreateObject]( https://msdn.microsoft.com/zh-cn/library/xzysf6hc%28v=vs.84%29.aspx)方法。除了那些之外,还有VBScript的内置[CreateObject](https://msdn.microsoft.com/zh-cn/library/dcw63t7z%28v=vs.84%29.aspx)方法。还困惑吗? (3认同)
  • @feetwet每当我看到这种模式时,都会不寒而栗,您可能有什么原因在循环中执行数据库调用?通过重新思考问题并调整方法,可以更有效地完成人们给出的大多数理由。 (2认同)