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

时间:2014-02-20 17:59:03

标签: sql asp-classic ado

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

问题是两件事之一:要么我得到一个空的回复,要么我的代码有问题。我确信这个命令应该从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)

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

    set rs = Server.CreateObject("ADODB.RecordSet") 
    rs.oppen objCommandSec
而不是

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

3 个答案:

答案 0 :(得分:5)

使用多年后的一些提示

  1. 无需创建ADODB.Connection即可将连接字符串直接传递给.ActiveConnection对象的ADODB.Command属性。这有两个好处,您没有实例化并打开另一个对象,并且因为上下文与ADODB.Command相关联,它将与Set objCommandSec = Nothing一起发布。
  2. .Execute返回已关闭记录集的常见原因是由于SET NOCOUNT ON未在SQL存储过程中设置,因为INSERTUPDATE将生成记录受影响的计数和关闭的记录集。设置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
    

答案 1 :(得分:2)

看了几分钟,自从我使用经典的asp之后,这是很长的时间,但我确实看到了三件事要看:

  1. 在致电Open之前,您是否需要objCommandSec.Execute连接?
  2. 你可以尝试在循环中写出一个字符串文字,它完全不依赖于记录集......只是你实际上循环遍历代码,所以看看记录是否会回到记录集。 / LI>
  3. 您是否检查过html源代码,看看格式错误的html是否隐藏了您的结果?我记得在经典的asp循环中使用表格会发生这种情况,其中数据会以某种方式隐藏在两行之间,或者错误位置的结束表标记将结束表格,后来的行将不可见。

答案 2 :(得分:0)

虽然这可能不会直接回答OP问题,但它可能会帮助其他人寻找解决方案。

最近我有一项维护工作,要求我修改正在运行的ASP经典代码(我已经很久没写了)。程序调用的编写方式与OP相同,这不是我过去的工作方式。

这是我过去使用的语法,我认为它比这里提供的其他解决方案更清晰。

以下代码显示如何读取输出参数,将参数传递给存储过程,将null值传递给参数,读取记录计数以及在RecordSet中迭代。

dim conn, cmd, rs

set conn = Server.CreateObject("ADODB.Connection")
conn.Open "Driver={SQL Server};Server=servername;Uid=username;Pwd=password;Database=dbname;"

set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "procedurename"
cmd.Parameters.Refresh
cmd.Parameters("@nullparam") = null
cmd.Parameters("@strparam") = "1"
cmd.Parameters("@numparam") = 100

set rs = Server.CreateObject ("ADODB.RecordSet")
rs.CursorLocation = adUseClient ' to read recordcount'

rs.open cmd, , adOpenStatic, adLockReadOnly

Response.Write "Return Value: " & cmd.Parameters("@RETURN_VALUE") & "<br />"
Response.Write "Record count: " & rs.RecordCount & "<br />"
while not rs.EOF 
    ' or do whatever you like with data'
    Response.Write rs("colname") & "<br>"
    rs.MoveNext
wend