2010-01-08 34 views
7

Cada vez que intento acceder a la propiedad RecordCount, siempre obtengo un valor de retorno de -1. A continuación está mi código de muestra.ADO.RecordCount es igual a - 1 problema

Set oConn = Server.CreateObject ("ADODB.Connection") 
oConn.Open Application("strConnectstring") 
Set rs = Server.CreateObject ("ADODB.Recordset") 
rs.ActiveConnection = oConn 
SQL = "Publications_PicoSearchListing" 
set rs = oConn.execute(SQL) 

No estoy seguro de si estoy haciendo forwardCursor o cursores dinámicos, o si el proveedor admite incluso la propiedad RecordCount. ¿Cómo puedo verificar si el proveedor admite la propiedad RecordCount o si estoy utilizando forwardCursor o cursores dinámicos?

Cualquier ayuda sería apreciada.

Gracias

Respuesta

3

para paginación puede utilizar el recordset.PageSize y recordset.AbsolutePage como esto

Set rs = Server.CreateObject("ADODB.Recordset") 
' make recordset use adUSEclient (client side cursor)' 
rs.CursorLocation = 3 
' make recordset use the adOpenStatic cursor (scrollable)' 
rs.CursorType = 3 
rs.PageSize = RecordsPerPage 

rs.Open sql, conn 
' go to selected page' 
if not rs.EOF and not rs.BOF then 
    rs.AbsolutePage = page_you_want_to_go 
end if 

a continuación, tiene acceso a recordset.PageCount saber el número de páginas devueltas ..

+0

¿No lee todos los registros hasta la página que está solicitando? Porque está utilizando los registros con el adUseCLient como CursorLocation. – Edelcom

+0

en realidad lee todos los registros que se ajustan a la consulta sql ... pero establece el registro actual para que apunte al que desea según el tamaño de página y la página absoluta. no ha encontrado la manera de devolver solo los datos que desea, permita Conjunto de registros para ser desconectado y también mantener los nombres de campo. –

3

Tenga en cuenta: a menos que mueva hasta el final del conjunto de registros no hay garantía de que el RecordCount habrá sido rellenada. El patrón estándar para iterar sobre cada fila en el conjunto de registros usando While Not rs.EOF. En todo el código de VBA que he escrito, nunca he confiado en verificar rs.RecordCount

En lugar de verificar el tipo de cursor, puede configurarlo. Por ejemplo:

Set conn=Server.CreateObject("ADODB.Connection") 
conn.Provider="Microsoft.Jet.OLEDB.4.0" 
conn.Open(Server.Mappath("northwind.mdb")) 
set rs = Server.CreateObject("ADODB.recordset") 
sql="SELECT * FROM Customers" 

rs.CursorLocation = adUseClient 
rs.CursorType = adOpenStatic 
rs.LockType = adLockBatchOptimistic 

rs.Open sql, conn 

Si lo que quieres es el recuento, ¿por qué no emiten un "SELECT Count (*) A partir de Publications_PicoSearchListing"

De Interés ?: Understanding ADO's Default Cursor Type

Otra alternativa para obtener el RecordCount es ejecutar:

rs.MoveLast 
rs.MoveFirst 

y compruebe el RecordCount, e incluso entonces me parece recordar algunos tipos de cursor no están garantizados (pero m emory brumoso en esto).

También tenga en cuenta: No utilice MoveLast/MoveFirst a menos que realmente lo necesite: esto será lento con un juego de registros grande o un juego de registros dibujado en una red. En su lugar, use la técnica Count (*).

+0

la razón por la que necesito utilizar el RecordCount se debe a que la implementación de una solución de paginación. –

+0

No utilice rs.MoveLast y rs.MoveFirst, esto puede llevar a un rendimiento muy malo. Use la solución select count (*) para saber con cuántos registros está tratando. – Edelcom

4

La cuenta de registro no es compatible con el cursor predeterminado de solo reenvío. debe añadir parámetros adicionales a la orden de apertura

sql rs.open, conec, 1,1

Esto debería permitir que usted tiene acceso a rs.RecordCount.

Pero la paginación se realiza mejor mediante el método Recordset.GetRows() + Recordset.Move().

http://databases.aspfaq.com/database/how-do-i-page-through-a-recordset.html (desplazarse hacia abajo a los audaces "Recordset.GetRows() + Recordset.Move()" se trata de manera más rápida sin necesidad de utilizar procedimientos almacenados)

+1

usted, señor, es un maldito genio básico visual – BrainO2