Using Stored Procedure in Classical ASP .. execute and get results
我整天试图解决这个问题,但它似乎对我不起作用。我想执行一个命令并将结果返回到记录集。
问题是两件事之一:我得到的响应是空的,或者我的代码有问题。我知道该命令应该从数据库中获取几行。我在循环内添加了
这是代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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的回答,解决方案是:
1 2 | SET rs = Server.CreateObject("ADODB.RecordSet") rs.oppen objCommandSec |
而不是...
1 2 | SET rs = Server.CreateObject("ADODB.RecordSet") rs = objCommandSec.Execute |
使用asp-classic多年后的技巧
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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 |
看了几分钟,距离我使用经典的asp已经很长时间了,但是我确实看到了三件事:
尽管这可能无法直接回答OP的问题,但可能会帮助其他人寻找解决方案。
最近,我进行了一项维护工作,该工作需要我修改正在运行的ASP经典代码中的某些内容(我已经很长时间没有写过了)。过程调用的编写方式与OP的编写方式相同,而这与我过去的操作方式不同。
这是我过去使用的语法,我认为它比这里提供的其他解决方案更简洁。
以下代码显示如何读取输出参数,如何将参数传递给存储过程,将空值传递给参数,读取记录计数以及在RecordSet中进行迭代。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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") &"" rs.MoveNext wend |