ASP Classic Recordset в хранимой процедуре -1 Количество записей - PullRequest
0 голосов
/ 10 июня 2019

Я работаю с хранимой процедурой SQL Server в Classic ASP с 3 параметрами.Я пытаюсь найти счет записи, но он возвращает '-1'.
Я видел похожий пост , сделал то, что он предложил (проверьте cursortype и добавьте 'set nocount on' в хранимой процедуре), но эти изменения не повлияли на количество записей -1.

Вот мой код на странице Classic ASP, ниже.

strInterestName = request("InterestName") 
strActiveDate = request("activedate")
strExpireDate = request("expiredate")


Set objCommandSec = CreateObject("ADODB.Command") 
Set objRS = CreateObject("ADODB.RecordSet") 
objRS.cursorlocation = 3
objRS.cursortype = adOpenStatic 


With objCommandSec  
Set .ActiveConnection = objConnection  
.CommandText = "[01_cms_search_pg_select_news_items_4]"  
.CommandType = 4   
.Parameters.Append .CreateParameter("@InterestName",adVarChar,
adParamInput, 25)              
.Parameters.Append .CreateParameter("@ActiveDate",adDate, adParamInput)  
.Parameters.Append .CreateParameter("@ExpireDate",adDate,
    adParamInput)
.Parameters("@InterestName") = strInterestName
.Parameters("@ActiveDate") = strActiveDate   
.Parameters("@ExpireDate") = strExpireDate

 set objRS =.Execute()   
End With  

Ниже приведен код для хранимой процедуры:

ALTER PROCEDURE [dbo].[01_cms_search_pg_select_news_items_4]

@InterestName varchar(50), 
@ActiveDate datetime, 
@ExpireDate datetime


AS DECLARE @sql nvarchar(4000)

SELECT @sql = ' SELECT * ' + 
              ' FROM news ' +
              ' WHERE ' +
              ' bulletin_display_indicator = ''true'' '+
              ' AND ' +
              ' website_homepg_display_indicator= ''false'' '



IF @InterestName is not null    
SELECT @sql = @sql + ' AND (InterestName = @InterestName) 

IF @ExpireDate is not null and @ExpireDate IS NOT NULL
SELECT @sql = @sql + ' AND (expiredate between @ActiveDate and @ExpireDate)


SELECT @sql = @sql + '; '

EXEC sp_executesql @sql, N'@InterestName varchar(50), @ActiveDate
DateTime, @ExpireDate DateTime',@InterestName, @ActiveDate,
@ExpireDate

1 Ответ

1 голос
/ 11 июня 2019

Я боролся с этим некоторое время, затем нашел то, что работает для меня. Это не красиво, но это делает работу.

Ваша хранимая процедура должна вернуть 2 набора записей: один с нужными вам данными таблицы, а другой с количеством записей:

SELECT <all_you_need> FROM <your_table> WHERE <your_arguments>
SELECT [myCount] = @@ROWCOUNT

Затем в вашем ASP-файле:

dim objRS, dataRS, countRS
Set objRS = CreateObject("ADODB.RecordSet") 
Set dataRS = CreateObject("ADODB.RecordSet") 
Set countRS = CreateObject("ADODB.RecordSet") 
[your original call to the stored procedure]
set objRS =.Execute()
set dataRS = objRS
set countRS = objRS.nextrecordset()

countRS теперь содержит набор записей с одной строкой и одним столбцом с именем «myCount», который можно запросить, чтобы получить количество записей. dataRS содержит ваш оригинальный набор данных.

ПРИМЕЧАНИЕ: если вам не нужно знать количество записей ДО того, как вы обработаете набор данных, вы можете упростить это следующим образом:

dim objRS, countRS
Set objRS = CreateObject("ADODB.RecordSet") 
Set countRS = CreateObject("ADODB.RecordSet") 
[your original call to the stored procedure]
set objRS =.Execute()
[process your dataset as you need to]
set countRS = objRS.nextrecordset()
...