2009-06-29 2 views
3

Я не совсем хорошо знаком с программированием ASP classic. Мне просто нужен небольшой код для работы на моей веб-странице. Как подсчитать запись возвращаемого запроса?как считать записи в ASP classic?

<% 
Set rsscroll = Server.CreateObject("ADODB.Recordset") 
Dim strSQLscroll, rsscroll 
strSQLscroll = "SELECT * FROM tblItems where expiration_date > getdate() order by expiration_date desc;" 
rsscroll.open strSQLscroll,oConn 
%> 

спасибо,

ответ

6

rsscroll. RecordCount

+1

Это может работать, но он может также возвращать -1. Например, набор строк по умолчанию для сервера firehose по умолчанию не будет давать количество строк до тех пор, пока все записи не будут использованы вызывающим абонентом. – AnthonyWJones

+0

Имейте в виду, что вам необходимо установить nocount. см. http://stackoverflow.com/a/16617637/356544 – Slider345

1

Вы можете просто изменить SQL для подсчета записей:

strSQLscroll = "SELECT count(*) as Total FROM tblItems where expiration_date > getdate();" 

Тогда вам просто нужно response.write rsscroll("Total")

7

Возможно (но не рекомендуется) использовать свойство RecordCount на объекте Recordset следующим образом:

iTotalRecords = rsscroll.RecordCount 

Если ваш стол действительно большой, это может занять много времени. Вместо этого я бы запустил отдельный SQL-запрос, чтобы получить общее количество записей

SQL = "SELECT COUNT(*) AS TotalRecords FROM tblItems WHERE expiration_date > getdate() " 
set rsRecordCount = conn.Execute(SQL) 
if not rsRecordCount.Eof then 
    iTotalRecords = rsRecordCount.Fields("TotalRecords") 
else 
    iTotalRecords = 0 
end if 
rsRecordCount.Close 
set rsRecordCount = nothing 
+0

Отличный подход, работает для меня :) – yaqoob

2

Одно простое решение для использования метода SQL COUNT. Это предполагает, что вы хотите количество строк, а не самих данных.

<% 
    Set rsscroll = Server.CreateObject("ADODB.Recordset") 
    Dim strSQLscroll, rsscroll, intRow 
    strSQLscroll = "SELECT COUNT(*) AS Total FROM tblItems WHERE expiration_date > getdate();" 
    rsscroll.open strSQLscroll, oConn 
    response.write rsscroll("Total") 
    rsscroll.close: set rsscroll = nothing 
    oConn.close: set oConn = nothing 
%> 

Это возвращает одну строку с единственным значением, называемым «Всего». (Читайте дальше, если вам нужны оба числа строк и данные.)

В вашем коде запроса используется RecordSet по умолчанию, который возвращает данные в режиме «только вперед» для повышения эффективности. Он будет шаг за шагом, но не знает фактического счета. (Этот режим также устанавливает значение RecordSet.RecordCount равным -1, поэтому поле вам не полезно.)

Параметр RecordSet.Open «Cursor Type» позволяет вам перейти в режим «Keyset» (значение параметра 1), который делает, установите для поля RecordCount количество строк данных. («Тип замка» и «Тип команды» Параметры для полноты, но они не фигурируют в этом ответе.)

RecordsetObject.Open "TableName|SQLStatement", ConnectionObject [,Cursor Type] [,Lock Type] [,Command Type] 

Добавить этот параметр в RecordSet.Open вызова вашего кода, а затем проверить RecordCount.

<% 
    Set rsscroll = Server.CreateObject("ADODB.Recordset") 
    Dim strSQLscroll, rsscroll, intRow 
    strSQLscroll = "SELECT * FROM tblItems where expiration_date > getdate() order by expiration_date desc;" 
    rsscroll.open strSQLscroll, oConn, 1 
    intRow = rsscroll.RecordCount 
    ' ... do something with intRow 
    rsscroll.close: set rsscroll = nothing 
    oConn.close: set oConn = nothing 
%> 

Если производительность базы данных означает, что что-нибудь к вашей ситуации, RecordSet.GetRows() метод намного более эффективным.

<% 
    Dim rsscroll, intRow, rsArray 
    Set oConn = CreateObject("ADODB.Connection") 
    oConn.open "<connection string>" 
    strSQLscroll = "SELECT * FROM tblItems where expiration_date > getdate() order by expiration_date desc" 
    Set rsscroll = conn.execute(strSQLscroll) 
    if not rsscroll.eof then 
     rsArray = rsscroll.GetRows() 
     intRow = UBound(rsArray, 2) + 1 
     response.write "rows returned: " & intRow 
     ' ... do any other operations here ... 
    end if 
    rsscroll.close: set rsscroll = nothing 
    oConn.close: set oConn = nothing 
%> 
1

Я обычно использую отдельный запрос типа «SELECT COUNT (*) из таблицы», чтобы получить отсчеты, потому что я обычно нужно не только количество, но суммирование количества единиц или средней цены или что-то и это проще написать отдельный запрос, чем сделать больше переменных, и сказать «TotalUnits = TotalUnits + rs (« Units »). значение« внутри цикла »для отображения результатов. Это также полезно в те времена, когда вам нужно показать итоговые значения выше результатов, и вы не хотите, чтобы цикл был дважды установлен в наборе записей.

0

<% «TableID = ваши таблицы ID ...

Set rsscroll = Server.CreateObject("ADODB.Recordset") Dim strSQLscroll, rsscroll strSQLscroll = "SELECT *,(SELECT TableID FROM tblItems where expiration_date > getdate()) As Count FROM tblItems where expiration_date > getdate() order by expiration_date desc;" 
rsscroll.open strSQLscroll,oConn 
Count = rsscroll("Count") 

%>

1

Получить в Habbit хранения возвращаемых данных в массивах. Это удивительно быстрее для повторения, чем использование открытого набора записей. Кроме того, укажите поля для выбора при выполнении этого, поскольку вам нужно явно ссылаться на индекс массива.

<% 
Set rsscroll = Server.CreateObject("ADODB.Recordset") 
Dim strSQLscroll, rsscroll 
Dim arrCommon 

'Open recordset, copy data to array 
strSQLscroll = "SELECT field1, field2, field3 FROM tblItems where expiration_date > getdate() order by expiration_date desc;" 
rsscroll.open strSQLscroll,oConn 
    arrCommon = rsscroll.getRows() 
rsscroll.close 

'Get the total records in this array 
response.write ubound(arrCommon, 2); 

'Loop... 
for i = 0 to ubound(arrCommon, 2) 

    ' This prints field 3 
    response.write arrCommon(2, i) 

next 
%> 
0

Вы можете попробовать это

Dim count 
    count = 0 
    if strSQLscroll.eof <> true or strSQLscroll.bof <> true then 
     while not strSQLscroll.eof 
      count = count+1 
      strSQLscroll.movenext 
     wend 
    end if 
    response.write(count) 
0

Если вы используете MySQL, попробуйте следующее:

Dim strSQLscroll, rsscroll, countrs 

Set rsscroll = Server.CreateObject("ADODB.Recordset") 
rsscroll.CursorLocation = 3 
rsscroll.open "SELECT * FROM tblItems where expiration_date > getdate() 
order by expiration_date desc;",oConn 

countrs = rsscroll.recordcount 
+0

Добро пожаловать в Stack Overflow! Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно * почему * и/или * как * этот код отвечает на вопрос, улучшает его долгосрочную ценность. –