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)
几年后使用asp经典的技巧
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
Run Code Online (Sandbox Code Playgroud)看了几分钟,自从我使用经典 asp 以来已经很长时间了,但我确实看到了三件事需要注意:
Open先连接吗objCommandSec.Execute?