2010-01-08 1 views
7

Когда я пытаюсь получить доступ к свойству RecordCount, я всегда получаю возвращаемое значение -1. Ниже приведен пример кода.ADO.RecordCount equals - 1 problem

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) 

Я не уверен, если я делаю forwardCursor или динамические курсоры, или если поставщик даже поддерживает свойство RecordCount. Как проверить, поддерживает ли провайдер свойство RecordCount, или я использую либо курсор forwardCursor, либо динамические курсоры.

Любая помощь будет оценена по достоинству.

Спасибо

ответ

3

Для пейджинга можно использовать recordset.PageSize и recordset.AbsolutePage как этот

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 

вы затем получить доступ к recordset.PageCount знать количество возвращаемых страниц ..

+0

Не читает ли это все записи на странице, которую вы запрашиваете? Поскольку вы используете записи с adUseCLient как CursorLocation. – Edelcom

+0

на самом деле он считывает все записи в соответствии с запросом sql .. но устанавливает текущую запись, указывая на то, что вы хотите, на основе параметров и абсолютной ссылки. не нашли способ вернуть только нужные данные, разрешить набор записей, который необходимо отключить, а также сохранить имена полей. –

3

Пожалуйста, обратите внимание: если вы не перейти к концу записей нет никакой гарантии, что RecordCount будет заселен. Стандартный шаблон для итерации по каждой строке в наборе записей с использованием While Not rs.EOF. Во всем коде VBA, который я когда-либо писал, я никогда не полагался на проверку rs.RecordCount

Вместо проверки типа курсора вы можете установить его. Например:

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 

Если все, что вы хотите, это граф, почему бы не испускают "SELECT COUNT (*) От Publications_PicoSearchListing"

Of Interest ?: Understanding ADO's Default Cursor Type

Другая альтернатива получить RecordCount будет выполнять:

rs.MoveLast 
rs.MoveFirst 

, а затем проверить RecordCount, и даже тогда я, кажется, помню некоторые типы курсора не гарантируется (но м emory туманно по этому поводу).

Также обратите внимание:: Не используйте MoveLast/MoveFirst, если вам действительно не нужно: это будет медленным с большим набором записей или набором записей, нарисованным по сети. Вместо этого используйте метод Count (*).

+0

причины, почему мне нужно использовать RecordCount потому, что я реализацию решения подкачки. –

+0

Не используйте rs.MoveLast и rs.MoveFirst, это может привести к очень плохой производительности. Используйте решение select count (*), чтобы узнать, сколько записей вы имеете в виду. – Edelcom

4

Recordcount не поддерживается курсором только по умолчанию. необходимо добавить дополнительные параметры открытой команды

rs.open SQL, Conn, 1,1

Это должно позволить вам иметь доступ к rs.recordcount.

Но пейджинг лучше всего использовать с помощью метода Recordset.GetRows() + Recordset.Move().

http://databases.aspfaq.com/database/how-do-i-page-through-a-recordset.html (прокрутите вниз до смелых «Recordset.GetRows() + Recordset.Move()» это самый быстрый способ без использования хранимых процедур)

+1

вы, сэр, являются смелыми визуальными базовыми гениальными – BrainO2

 Смежные вопросы

  • Нет связанных вопросов^_^