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

我试图整天解决这个问题,但似乎并不适合我。 我想执行一个命令并将结果返回到一个logging集。

这个问题是两件事之一:要么我得到一个空的回应,或者我的代码有问题。 我知道这个命令应该从数据库中取几行。 我在循环中添加了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) 

编辑修改代码后,@Joel Coehoorn答案,解决scheme是:

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

代替

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

看了几分钟,我已经使用了经典的asp 很长一段时间了,但是我看到了三件事情要看:

  1. 你需要在调用objCommandSec.Execute之前Open连接吗?
  2. 你可以试着在循环内写出一个string字面值,它根本不依赖于logging集……只是你实际上循环了代码,所以看看logging是否回到logging集。
  3. 你有没有检查过的HTML源代码,看是否可能是格式错误的HTML隐藏你的结果? 我记得在经典的asp循环中发生了几次这样的事情,在这两个行之间,数据会被隐藏起来,或者在错误的地方closures表标签会结束表,后面的行将不可见。

在与asp-classic合作多年之后的几个技巧

  1. 不需要创buildADODB.Connection ,可以将连接string直接传递给ADODB.Command对象的.ActiveConnection属性。 这有两个好处,你没有实例化和打开另一个对象,因为上下文绑定到ADODB.Command ,它将与Set objCommandSec = Nothing一起发布。
  2. .Execute返回一个closures的logging集的一个常见原因是由于SET NOCOUNT ON没有在SQL存储过程中设置,因为INSERTUPDATE将生成logging受影响的计数和closures的logging集。 设置SET NOCOUNT ON将停止这些输出,只有您预期的logging集将被返回。
  3. 使用ADODB.Recordset来遍历你的数据是不必要的,除非你需要前后移动,并支持一些标准function所不需要的较less使用的方法,比如将logging集显示到屏幕上。 请尝试使用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 

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

最近我有一个维护工作,需要我修改运行的ASP经典代码(我没有写在年龄)的东西。 程序调用与OP所写的方式相同,而这并不是我过去的做法。

这是我过去使用的语法,我认为它比这里提供的其他解决scheme更清洁一些。

以下代码显示了如何读取输出参数,将parameter passing给存储过程,将null值传递给参数,读取logging计数,并在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 
Interesting Posts