Recordcount

mercoledì 20 dicembre 2006 - 16.43

clan Profilo | Junior Member

salve
qualcuno sa come sia possibile contare i record utilizzando un datareader
per essere più chiaro quello che in vb6 era
record.recordcount
Grazie

alextyx Profilo | Expert

Io credo che la soluzione migliore sia usare una query scalare e un oggetto command. Ti invio questo esempio in cui cerco di sapere quanti sono i record della tabella TabContatti. In questo caso non ho nessun criterio di selezione (WHERE) ma avrei potuto averlo. Come vedi, uso una utile funzioncina (EseguiQueryScalareSQL) che però potrebbe essere inglobata nel codice della prima. Io la uso da più punti e mi conviene così, ma tu puoi fare diversamente. In questo caso, tra l'altro, ridonda la dichirazione della connessione da usare :

Public Function NumeroContatti() As Integer
Dim c As New OleDbCommand("SELECT COUNT (IDContatto) FROM TabContatti", GIN.CnnOle)
NumeroContatti = CInt(c.ExecuteScalar)
Return NumeroContatti
c.Dispose()
End Function




''' <summary>
''' Restituisce un oggetto che è il risultato di una query scalare (es.: COUNT,SUM,MAX,MIN, ecc...).
''' Se c'è qualche problema, restituisce un oggetto impostato a nothing
''' </summary>
''' <param name="StrSQL">Stringa SQL contenente il comando</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function EseguiQueryScalareSQL(ByVal StrSQL As String) As Object

Dim C As New OleDbCommand(StrSQL, GIN.CnnOle)
Try
EseguiQueryScalareSQL = C.ExecuteScalar
Catch ex As Exception
EseguiQueryScalareSQL = Nothing
MessageBox.Show(GIN.CstInizioMessaggioErrore & ex.Message & ControlChars.CrLf & ex.StackTrace)
Finally
C.Dispose()
C = Nothing
End Try

End Function

clan Profilo | Junior Member

ciao
ho fatto delle prove ma ExecuteScalar mi restituisce sempre uno.
Ps la relazione fra le due funzioni che hai inerito nel post precedente?
Mi sembra facciano la stessa cosa.
Ciao

alextyx Profilo | Expert

Sì, è vero, colpa della fretta. Una è una funzione di uso generale che evita la noia di ricordarsi di eliminare gli oggetti di predisporre il try catch, ecc...
Solo che in effetti nell'esempio che ho preso....non la uso!
Comunque se la query che dai in pasto all'executescalar ha la stessa condizione WHERE, dovrebbe risultarti lo stesso numero di record che potresti scorrere con il datareader. Il datareader, a differenza del caro vecchio recordset, non ha il count e qiundi, o te li scorri tutti e li conti, o fai una query come quella che ti ho postato, oppure passi ad usare altri oggetti. Io in genere faccio tutto con datareader e command.
Prova a postare un po' di codice e vediamo se si scopre dov'è il problema!

Cteniza Profilo | Guru

Un datareader è un oggetto read-only foreward-only, fino a quando non sei arrivato all'ultimo elemento non puoi sapere di quanti elementi è composto il flusso di dati.
Se hai sql server o altro server abilitato a comandi multipli puoi impostare la tua select come:
SELECT COUNT(*) FROM mytable; SELECT campo, campo, campo FROM mytable;
Questo restituisce un datareader a due livelli interrogando il primo hai il numero di records, prima di leggere il secondo.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5