在经典ASP中使用存储过程..执行并获得结果

use*_*028 4 sql ado asp-classic

我整天试图解决这个问题,但它似乎对我不起作用.我想执行一个命令并将结果返回到记录集.

问题是两件事之一:要么我得到一个空的响应,要么我的代码有问题.我确信这个命令应该从DB获取几行.我response.write在循环中添加了,但它们从未打印过.

这是代码:

Set conn = Server.CreateObject("ADODB.Connection")
conn.open "PROVIDER=SQLOLEDB;DATA SOURCE=X;DATABASE=Y;UID=Z;PWD=W;"


Set objCommandSec = CreateObject("ADODB.Command")
With objCommandSec
 Set .ActiveConnection = Conn
 .CommandType = 4
 .CommandText = "usp_Targets_DataEntry_Display"
 .Parameters.Append .CreateParameter("@userinumber ", 200, 1, 10, inumber)
 .Parameters.Append .CreateParameter("@group ", 200, 1, 50, "ISM")
 .Parameters.Append .CreateParameter("@groupvalue", 200, 1, 50, ismID)
 .Parameters.Append .CreateParameter("@targettypeparam ", 200, 1, 50, targetType)

End With 

set rs = Server.CreateObject("ADODB.RecordSet") 
rs = objCommandSec.Execute


while not rs.eof
    response.write (1)
    response.write (rs("1_Q1"))
    rs.MoveNext
wend
response.write (2)
Run Code Online (Sandbox Code Playgroud)

编辑 修改代码后,按照@Joel Coehoorn的回答,解决方案是:

    set rs = Server.CreateObject("ADODB.RecordSet") 
    rs.oppen objCommandSec
Run Code Online (Sandbox Code Playgroud)

代替

set rs = Server.CreateObject("ADODB.RecordSet") 
rs = objCommandSec.Execute
Run Code Online (Sandbox Code Playgroud)

Lan*_*art 6

几年后使用的技巧

  1. 无需创建ADODB.Connection可以将连接字符串直接传递给对象的.ActiveConnection属性ADODB.Command.这有两个好处,你没有实例化并打开另一个对象,因为上下文与ADODB.Command它将被释放相关联Set objCommandSec = Nothing.
  2. .Execute返回已关闭的记录集的一个常见原因是由于SET NOCOUNT ON未在SQL存储过程中设置,INSERT或者UPDATE将生成受记录影响的计数和已关闭的记录集.设置SET NOCOUNT ON将停止这些输出,只返回您预期的记录集.
  3. ADODB.Recordset除非您需要前后移动并支持标准功能不需要的一些较少使用的方法(例如将记录集显示到屏幕),否则使用循环浏览数据是过度的.而是尝试使用Array.

    Dim conn_string, row, rows, ary_data
    
    conn_string = "PROVIDER=SQLOLEDB;DATA SOURCE=X;DATABASE=Y;UID=Z;PWD=W;"
    
    Set objCommandSec = CreateObject("ADODB.Command")
    With objCommandSec
      .ActiveConnection = conn_string
      .CommandType = 4
      .CommandText = "usp_Targets_DataEntry_Display"
      .Parameters.Append .CreateParameter("@userinumber ", 200, 1, 10, inumber)
      .Parameters.Append .CreateParameter("@group ", 200, 1, 50, "ISM")
      .Parameters.Append .CreateParameter("@groupvalue", 200, 1, 50, ismID)
      .Parameters.Append .CreateParameter("@targettypeparam ", 200, 1, 50, targetType)
    
      Set rs = .Execute()
      If Not rs.EOF Then ary_data = rs.GetRows()
      Call rs.Close()
      Set rs = Nothing
    End With
    Set objCommandSec = Nothing
    
    'Command and Recordset no longer needed as ary_data contains our data.
    If IsArray(ary_data) Then
      ' Iterate through array
      rows = UBound(ary_data, 2)
      For row = 0 to rows
        ' Return our row data
        ' Row N column 2 (index starts from 0)
        Call Response.Write(ary_data(1, row) & "")
      Next
    Else
      ' Nothing returned
      Call Response.Write("No data returned")
    End If
    
    Run Code Online (Sandbox Code Playgroud)

  • 谢谢,非常有帮助! (2认同)

Joe*_*orn 2

看了几分钟,自从我使用经典 asp 以来已经很长时间了,但我确实看到了三件事需要注意:

  1. 打电话前需要Open先连接吗objCommandSec.Execute
  2. 您可以尝试在循环内写出一个字符串文字,它根本不依赖于记录集...只是您实际上是在循环代码,所以看看记录是否返回到记录集。
  3. 您是否检查过 html 源代码,看看格式错误的 html 是否隐藏了您的结果?我记得这种情况在经典的 asp 循环中的表中发生过几次,其中数据会以某种方式隐藏在两行之间,或者错误位置的关闭表标记会结束表,并且后面的行将不可见。