2010-01-08 36 views
7

Khi nào tôi cố gắng truy cập thuộc tính RecordCount, tôi luôn nhận được giá trị trả về là -1. Dưới đây là mã mẫu của tôi.ADO.RecordCount bằng - 1 vấn đề

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) 

Tôi không chắc chắn liệu tôi có đang tiến lên Con trỏ hoặc con trỏ động hay nhà cung cấp thậm chí hỗ trợ thuộc tính RecordCount. Làm cách nào để kiểm tra xem nhà cung cấp có hỗ trợ thuộc tính RecordCount hay tôi đang sử dụng con trỏ forwardCursor hoặc động.

Mọi trợ giúp sẽ được đánh giá cao.

cảm ơn

Trả lời

3

Đối với phân trang, bạn có thể sử dụng recordset.PageSizerecordset.AbsolutePage như

này
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 

sau đó bạn có thể truy cập recordset.PageCount để biết số lượng trang trả lại ..

+0

Điều này không đọc tất cả hồ sơ tối đa trang bạn đang yêu cầu? Vì bạn đang sử dụng các bản ghi với adUseCLient làm CursorLocation. – Edelcom

+0

thực sự nó đọc tất cả các bản ghi phù hợp với truy vấn sql .. nhưng đặt bản ghi hiện tại để trỏ vào bản bạn muốn dựa trên pagesize và absolutepage .. chưa tìm thấy cách trả về dữ liệu bạn muốn, cho phép recordset bị ngắt kết nối và cũng duy trì tên trường. –

3

Xin lưu ý: nếu bạn không chuyển đến cuối recordset không có đảm bảo rằng RecordCount sẽ được dân cư. Mẫu chuẩn để lặp qua mỗi hàng trong bảng ghi bằng cách sử dụng While Not rs.EOF. Trong tất cả mã VBA tôi từng viết, tôi chưa bao giờ dựa vào việc kiểm tra rs.RecordCount

Thay vì kiểm tra loại con trỏ, bạn có thể đặt nó. Ví dụ:

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 

Nếu tất cả các bạn muốn là số lượng, tại sao không phát ra một "SELECT Count (*) Từ Publications_PicoSearchListing"

Quan ?: Understanding ADO's Default Cursor Type

Một cách khác để có được những RecordCount là để thực thi:

rs.MoveLast 
rs.MoveFirst 

và sau đó kiểm tra RecordCount, và thậm chí sau đó tôi dường như nhớ một số loại con trỏ không được đảm bảo (nhưng m emory mơ hồ về điều này).

Cũng lưu ý: Không sử dụng MoveLast/MoveFirst trừ khi bạn thực sự cần: điều này sẽ chậm với bản ghi lớn hoặc bản ghi được vẽ trên mạng. Thay vào đó, hãy sử dụng kỹ thuật Count (*).

+0

lý do tại sao tôi cần phải sử dụng RecordCount là vì tôi thực hiện một giải pháp phân trang. –

+0

Không sử dụng rs.MoveLast và rs.MoveFirst, điều này có thể dẫn đến hiệu suất rất kém. Sử dụng giải pháp chọn số (*) để biết bạn đang xử lý bao nhiêu bản ghi. – Edelcom

4

Số lần ghi không được hỗ trợ với con trỏ chỉ chuyển tiếp mặc định. bạn phải thêm các thông số bổ sung cho các lệnh mở

sql rs.open, conn, 1,1

Điều đó sẽ cho phép bạn có quyền truy cập vào rs.recordcount.

Nhưng phân trang được thực hiện tốt nhất bằng cách sử dụng phương thức Recordset.GetRows() + Recordset.Move().

http://databases.aspfaq.com/database/how-do-i-page-through-a-recordset.html (di chuyển xuống đậm "Recordset.GetRows() + Recordset.Move()" đây là cách nhanh nhất mà không sử dụng thủ tục lưu trữ)

+1

bạn, thưa bạn, là một freaking thị giác cơ bản genious – BrainO2

Các vấn đề liên quan