2009-06-29 7 views
3

Je ne suis pas très familier avec la programmation ASP classique. J'ai juste besoin d'un petit code pour fonctionner sur ma page Web. Comment puis-je compter l'enregistrement de la requête renvoyée?comment compter des enregistrements dans ASP classique?

<% 
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 
%> 

grâce,

Répondre

6

rsscroll. RecordCount

+1

Cela pourrait fonctionner, mais il peut aussi revenir -1. Par exemple, l'ensemble de lignes par défaut firehose du serveur SQL ne génère pas de nombre de lignes tant que tous les enregistrements n'ont pas été consommés par l'appelant. – AnthonyWJones

+0

Gardez à l'esprit que vous devez activer nocount. voir http://stackoverflow.com/a/16617637/356544 – Slider345

1

Vous pouvez simplement changer votre SQL pour compter les enregistrements:

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

Ensuite, vous avez juste besoin de response.write rsscroll("Total")

7

Il est possible (mais non recommandé) d'utiliser la propriété RecordCount sur l'objet Recordset comme suit:

iTotalRecords = rsscroll.RecordCount 

Si votre table est vraiment grande, cela peut prendre beaucoup de temps à s'exécuter. Je voudrais plutôt exécuter une requête SQL distincte pour obtenir le total des enregistrements

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

Bonne approche, ça marche pour moi :) – yaqoob

2

Une solution simple pour utiliser la méthode SQL COUNT. Cela suppose que vous voulez le nombre de lignes et non les données elles-mêmes.

<% 
    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 
%> 

Ceci renvoie une ligne avec une seule valeur appelée "Total". (Lire la suite si vous avez besoin à la fois du nombre de lignes et.)

Votre code de requête utilise un RecordSet par défaut, qui retourne les données en mode "forward-only" pour plus d'efficacité. Il passera par rangée, mais ne connaîtra pas le nombre réel. (Ce mode définit également RecordSet.RecordCount sur -1, ce champ n'est donc pas utile pour vous.)

Le paramètre "Cursor Type" de RecordSet.Open vous permet de passer en mode "Keyset" (valeur de paramètre 1), définit le champ RecordCount sur le nombre de lignes de données. (« Type Lock » et les paramètres « Type de commande » inclus pour être complet, mais ils ne figurent pas dans cette réponse.)

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

Ajouter ce paramètre à l'appel RecordSet.Open de votre code, puis vérifier 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 
%> 

Si la performance de base de données signifie quoi que ce soit à votre situation, les RecordSet.GetRows() méthode est beaucoup plus efficace.

<% 
    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

J'utilise habituellement une requête distincte comme « select count (*) de la table » pour obtenir compte parce que je besoin habituellement non seulement le nombre mais la somme du nombre d'unités ou le prix moyen ou quoi et il est plus facile d'écrire une requête séparée que de faire plus de variables et dire "TotalUnits = TotalUnits + rs (" Units "). value" dans la boucle pour afficher les résultats. Il est également pratique pour les moments où vous devez afficher les totaux au-dessus des résultats et vous ne voulez pas boucler deux fois le jeu d'enregistrements.

0

<% 'TableID = l'ID de vos tables ...

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

Obtenez dans le Habitude de stocker des données renvoyées dans les tableaux. C'est incroyablement plus rapide à parcourir que d'utiliser un jeu d'enregistrements ouvert. En outre, spécifiez les champs à sélectionner lorsque vous le faites car vous devez référencer explicitement l'index du tableau.

<% 
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

Vous pouvez essayer cette

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

Si vous utilisez MySQL, essayez ceci:

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

Bienvenue dans Stack Overflow! Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant * pourquoi * et/ou * comment * ce code répond à la question améliore sa valeur à long terme. –