我试图整天解决这个问题,但它似乎对我不起作用。我想执行一个命令并将结果返回到记录集。
问题是两件事之一:要么我得到一个空的回复,要么我的代码有问题。我确信这个命令应该从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
答案 0 :(得分:5)
使用asp-classic多年后的一些提示
ADODB.Connection
即可将连接字符串直接传递给.ActiveConnection
对象的ADODB.Command
属性。这有两个好处,您没有实例化并打开另一个对象,并且因为上下文与ADODB.Command
相关联,它将与Set objCommandSec = Nothing
一起发布。.Execute
返回已关闭记录集的常见原因是由于SET NOCOUNT ON
未在SQL存储过程中设置,因为INSERT
或UPDATE
将生成记录受影响的计数和关闭的记录集。设置SET NOCOUNT ON
将停止这些输出,并且只返回预期的记录集。使用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之后,这是很长的时间,但我确实看到了三件事要看:
Open
之前,您是否需要objCommandSec.Execute
连接?答案 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