3.122 messaggi dal 16 maggio 2002
Non riesco a conteggiare il numero di record di un recordset se non scorrendolo tutto e incrementando un contatore. La proprietà RecordCount mi restituisce sempre -1. Dove sbaglio?
Ecco il codice che scrivo:
<%
Set rs = Server.CreateObject("ADODB.Recordset")
rs.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = "&Server.MapPath("/mdb-database/music.mdb")&";"
rs.Source = "SELECT * FROM news"
rs.CursorType = 0
rs.CursorLocation = 2
rs.LockType = 3
rs.Open()
Response.Write(rs.RecordCount)
%>
Mi viene stampato a video sempre -1, eppure la tabella news del database contiene parecchi record. Infatti scrivendo
<%
tot = 0
Do while not rs.EOF and not rs.BOF
tot = tot+1
rs.Movenext()
Loop
%>
tot contiene effettivamente il numero dei records.
Dove sbaglio? E' più dispendioso (in termini di tempo di elaborazione) fare il ciclo di conteggio ogni volta che si ricarica la pagina, così vorrei evitarlo. Grazie.

Jim Raynor
http://www.freestyler.it

The day Microsoft makes something that doesn't suck
is probably the day they start making vacuum cleaners.

Get caught!
Get caught again!
1.605 messaggi dal 06 settembre 2002
prova così

<b>rs.CursorLocation = 3</b>

FORZA LA MAGICA ROMA

FORZA LA MAGICA ROMA
25 messaggi dal 11 settembre 2001
Perchè il metodo RecordCount funzioni bisogna impostare il CursorType ad 1;

quindi
const adOpenKeySet = 1
rs.open SQL, cn, adOpenKeySet

mandi mandi


3.122 messaggi dal 16 maggio 2002
Che tipo di proprietà sono CursorType e CursorLocation? Io non gli ho mai dato molta importanza.

Jim Raynor
http://www.freestyler.it

The day Microsoft makes something that doesn't suck
is probably the day they start making vacuum cleaners.

Get caught!
Get caught again!
11.886 messaggi dal 09 febbraio 2002
Contributi
Anche io non gli avevo dato mai tanta importanza, ma è molto utile capire a cosa servono... guarda te li elenco:

Il Cursor Type indica COME puoi muoverti all'interno del recordset.

0: ForwardOnly - Specifica che puoi andare solamente avanti, cioè puoi usare solo rs.MoveNext e non rs.MovePrevious ad esempio. Con un cursore forward only hai delle restrizioni, come hai potuto notare rs.RecordCount non funziona, in più non puoi usare la paginazione (comando rs.AbsolutePage e così via). Sappi comuque che se devi fare azioni elementari sul recordset (spostarti solo in avanti) è questo il cursore da preferire perchè è il più veloce come esecuzione

1: keyset - Questo non è supportato da access, ma è quello più completo, ti sposti avanti, indietro, usi la paginazione, il più completo insomma.

2: Dynamic - Questo è come il precedente solo che è supportato da access. Dammi retta, non usarli mai l'1 e il 2, sono lenti (in termini di millisecondi...).

3: Static - è la via di mezzo che concilia tutti. Questo è abbastanza veloce, puoi usare la paginazione, muoverti avanti e indietro ed usare recordcount.

Il LOCK TYPE invece indica come deve essere aperto il db:

1: Readonly - apre il database in sola lettura. E' quello da preferire quando devi solamente leggere il database
2: Pessimistic - apre il database sia in lettura che in scrittura. "Pessimistic" indica che il database non è accessibile da altri utenti quando anche uno solo di loro sta facendo delle modifiche. Questo non lo usare mai... tanto i database supportano diverse connessioni contemporanee, per cui se due utenti salvano allo stesso momento non succede niente.
3- Optimistic - apre in lettura e scrittura, soltanto che al momento del salvataggio viene bloccato solamente il record interessato e non tutti gli altri.
4- Batch Optimistic - in lettura e scrittura, adatto se devi aggiornare molti record... io non l'ho mai usato. boh


--------
CURSOR LOCATION
invece indica dove si deve posizionare il cursore all'apertura del recordset. Esempio: il rs è composto da 45 record... se non specifichi il cursor location, il record "selezionato" è il primo, cioè prima di incappare in rs.EOF dovrai fare rs.Movenext 45 volte.

Se specifichi cursorlocation = 35, all'apertura del recordset ti troverai già al record 35, per cui se fai rs.Movenext 10 volte, già ti troverai alla fine del recordset
-----------------------
Da una perla dal saggio:
Quando non hai capito, devi dire "non ho capito", no che dici che hai capito e invece non hai capito un cavolo. Hai capito?
-----------------------

Enjoy learning and just keep making
3.122 messaggi dal 16 maggio 2002
Ottima spiegazione! Grazie mille, ora ho le idee chiare.

Jim Raynor
http://www.freestyler.it

The day Microsoft makes something that doesn't suck
is probably the day they start making vacuum cleaners.

Get caught!
Get caught again!
101 messaggi dal 05 luglio 2001

x BrightSoul:
CursorLocation non ha il significato che intendi tu, ma identifica se si deve utilizzare un cursore lato Client o lato Server.
Ovviamente la differenza vale se si utilizza un database Sql Server (che supporta i cursori lato server) ma in genere è meglio utilizzare i cursori lato client.

Per quanto riguarda il problema di recordcount che ritorna -1 è descritto nel KnowledgeBase Microsoft:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q194973

In alternativa si può usare il metodo GetRows dell'oggetto ADODB.Recordset che ritorna un array bidimensionale delle righe e delle colonne e poi utilizzare la funzione UBound(array delle righe) per ottenere il numero di righe.
Il metodo GetRows è certamente affidabile e anche performante.


Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.