2011-02-16 68 views
3

我在ASP經典代碼,做一個MSSQL數據庫查詢:返回超過1000列,在傳統的ASP adodb.recordset

 rs.pagesize = 1000 ' this should enable paging 
     rs.maxrecords = 0 ' 0 = unlimited maxrecords  

     response.write "hello world 1<br>" 
     rs.open strSql, conn 

     response.write "hello world 2<br>" 

我的時候只有不到1000行返回的輸出是不錯的。超過1000行,我沒有得到「hello world 2」。

我認爲設置頁面大小設置分頁,並因此允許返回所有行,無論有多少行。如果不設置頁面大小,則不啓用分頁,限制爲1000行。然而,我的頁面就像頁面大小根本不工作一樣。

請指教。

+0

翻閱數據庫結果N個記錄在一個時間:http://www.4guysfromrolla.com/webtech/121298-1.shtml – Fionnuala 2011-02-21 11:51:21

+1

如果你沒有進入「hello world 2」這一行,這意味着你會得到錯誤,這與分頁無關。從你的代碼中刪除任何錯誤恢復下一行,再次運行,你很可能會看到錯誤信息。 – 2011-02-21 13:31:58

回答

0

試着改變你的rs.open行:

rs.Open strSQL, Conn, 3, 1, &H0001 

這裏的函數調用和參數的故障: recordsetobject.Open源的ActiveConnection,CursorType的,鎖定類型,選項

3 - adOpenStatic

1 - adLockReadOnly

& H0001 - adCmdText

我把這個從我的一些舊代碼中提取出來。我不記得爲什麼這個參數組合是必要的,但它是實現分頁的必要條件。

無限的記錄聽起來不錯,但我會設置一個限制,即使它非常喜歡。

如果您沒有收到「Hello World 2」輸出,是否有錯誤?這也會有所幫助。

0

尋呼就是爲了尋呼。

你的代碼在這裏是不夠的,但不管代碼如何,你爲什麼試圖返回1000行數據?

沒有人會讀取1000行數據,它可能會非常緩慢的性能。

+1

我有一個客戶需要訂單和客戶的報告。如果需要,他們將讀取10000行數據,並且他們有一個解析和分析數據的程序。是的,這很慢,但我們的應用程序中沒有界面來創建它。 – 2011-02-17 13:37:33

+1

我真的不認爲這是由社區決定如何使用代碼,而不是開發人員自己。如果他與原始開發人員的狀況不同,可能不會覺得有用。 – Kyle 2012-03-24 04:05:21

0

使用以下代碼,我從經典ASP中的sql server表中返回了4000多行。它沒有使用相同的方法,但它也沒有受到限制。

strconnect = "DRIVER={SQL Server};SERVER=****;DATABASE=****;UID=****;PWD=****" 
set conn=server.createobject("adodb.connection") 
conn.open strconnect 
set rs = conn.execute("select firstname from users") 
if not rs.eof then 
    f_Array = rs.getrows 
end if 
rs.close 
set rs = nothing 
conn.close 
set conn = nothing 

for x = 0 to ubound(f_Array, 2) 
    response.write (x+1) & ". " & f_Array(0,x) & "<br />" 
next 
1

是否有可能在打開記錄集之前聲明oRS.pagesize?

下面是使用分頁GetRows的一個很好的例子......

<!--VB ADO Constants file. Needed for the ad... constants we use--> 
<!-- #include file="adovbs.inc" --> 
<% 
' BEGIN USER CONSTANTS 
Dim CONN_STRING 
Dim CONN_USER 
Dim CONN_PASS 

' I'm using a DSN-less connection. 
' To use a DSN, the format is shown on the next line: 
'CONN_STRING = "DSN=DSNName;" 

CONN_STRING = "DBQ=" & Server.MapPath("database.mdb") & ";" 
CONN_STRING = CONN_STRING & "Driver={Microsoft Access Driver (*.mdb)};" 

' This DB is unsecured, o/w you'd need to specify something here 
CONN_USER = "" 
CONN_PASS = "" 

' Our SQL code - overriding values we just set 
' Comment out to use Access 
CONN_STRING = "Provider=SQLOLEDB;Data Source=10.2.2.133;" _ 
    & "Initial Catalog=samples;Connect Timeout=15;" _ 
    & "Network Library=dbmssocn;" 
CONN_USER = "samples" 
CONN_PASS = "password" 
' END USER CONSTANTS 


' BEGIN RUNTIME CODE 
' Declare our vars 
Dim iPageSize  'How big our pages are 
Dim iPageCount  'The number of pages we get back 
Dim iPageCurrent 'The page we want to show 
Dim strOrderBy  'A fake parameter used to illustrate passing them 
Dim strSQL   'SQL command to execute 
Dim objPagingConn 'The ADODB connection object 
Dim objPagingRS  'The ADODB recordset object 
Dim iRecordsShown 'Loop controller for displaying just iPageSize records 
Dim I    'Standard looping var 

' Get parameters 
iPageSize = 10 ' You could easily allow users to change this 

' Retrieve page to show or default to 1 
If Request.QueryString("page") = "" Then 
    iPageCurrent = 1 
Else 
    iPageCurrent = CInt(Request.QueryString("page")) 
End If 

' If you're doing this script with a search or something 
' you'll need to pass the sql from page to page. I'm just 
' paging through the entire table so I just hard coded it. 
' What you show is irrelevant to the point of the sample. 
'strSQL = "SELECT * FROM sample ORDER BY id;" 

' Sept 30, 1999: Code Change 
' Based on the non stop questions about how to pass parameters 
' from page to page, I'm implementing it so I can stop answering 
' the question of how to do it. I personally think this should 
' be done based on the specific situation and is clearer if done 
' in the same method on all pages, but it's really up to you. 
' I'm going to be passing the ORDER BY parameter for illustration. 

' This is where you read in parameters you'll need for your query. 
' Read in order or default to id 
'If Request.QueryString("order") = "" Then 
' strOrderBy = "id" 
'Else 
' strOrderBy = Replace(Request.QueryString("order"), "'", "''") 
'End If 

' Make sure the input is one of our fields. 
strOrderBy = LCase(Request.QueryString("order")) 
Select Case strOrderBy 
    Case "last_name", "first_name", "sales" 
     ' A little pointless, but... 
     strOrderBy = strOrderBy 
    Case Else 
     strOrderBy = "id" 
End Select 

' Build our SQL String using the parameters we just got. 
strSQL = "SELECT * FROM sample ORDER BY " & strOrderBy & ";" 

' Some lines I used while writing to debug... uh "test", yeah that's it! 
' Left them FYI. 
'strSQL = "SELECT * FROM sample WHERE id=1234 ORDER BY id;" 
'strSQL = "SELECT * FROM sample;" 
'Response.Write "SQL Query: " & strSQL & "<BR>" & vbCrLf 


' Now we finally get to the DB work... 
' Create and open our connection 
Set objPagingConn = Server.CreateObject("ADODB.Connection") 
objPagingConn.Open CONN_STRING, CONN_USER, CONN_PASS 

' Create recordset and set the page size 
Set objPagingRS = Server.CreateObject("ADODB.Recordset") 
objPagingRS.PageSize = iPageSize 

' You can change other settings as with any RS 
'objPagingRS.CursorLocation = adUseClient 
objPagingRS.CacheSize = iPageSize 

' Open RS 
objPagingRS.Open strSQL, objPagingConn, adOpenStatic, adLockReadOnly, adCmdText 

' Get the count of the pages using the given page size 
iPageCount = objPagingRS.PageCount 

' If the request page falls outside the acceptable range, 
' give them the closest match (1 or max) 
If iPageCurrent > iPageCount Then iPageCurrent = iPageCount 
If iPageCurrent < 1 Then iPageCurrent = 1 

' Check page count to prevent bombing when zero results are returned! 
If iPageCount = 0 Then 
    Response.Write "No records found!" 
Else 
    ' Move to the selected page 
    objPagingRS.AbsolutePage = iPageCurrent 

    ' Start output with a page x of n line 
    %> 
    <p> 
    <font size="+1">Page <strong><%= iPageCurrent %></strong> 
    of <strong><%= iPageCount %></strong></font> 
    </p> 
    <% 
    ' Spacing 
    Response.Write vbCrLf 

    ' Continue with a title row in our table 
    Response.Write "<table border=""1"">" & vbCrLf 

    ' Show field names in the top row 
    Response.Write vbTab & "<tr>" & vbCrLf 
    For I = 0 To objPagingRS.Fields.Count - 1 
     Response.Write vbTab & vbTab & "<th>" 
     Response.Write objPagingRS.Fields(I).Name 
     Response.Write "</th>" & vbCrLf 
    Next 'I 
    Response.Write vbTab & "</tr>" & vbCrLf 

    ' Loop through our records and ouput 1 row per record 
    iRecordsShown = 0 
    Do While iRecordsShown < iPageSize And Not objPagingRS.EOF 
     Response.Write vbTab & "<tr>" & vbCrLf 
     For I = 0 To objPagingRS.Fields.Count - 1 
      Response.Write vbTab & vbTab & "<td>" 
      Response.Write objPagingRS.Fields(I) 
      Response.Write "</td>" & vbCrLf 
     Next 'I 
     Response.Write vbTab & "</tr>" & vbCrLf 

     ' Increment the number of records we've shown 
     iRecordsShown = iRecordsShown + 1 
     ' Can't forget to move to the next record! 
     objPagingRS.MoveNext 
    Loop 

    ' All done - close table 
    Response.Write "</table>" & vbCrLf 
End If 

' Close DB objects and free variables 
objPagingRS.Close 
Set objPagingRS = Nothing 
objPagingConn.Close 
Set objPagingConn = Nothing 


' Show "previous" and "next" page links which pass the page to view 
' and any parameters needed to rebuild the query. You could just as 
' easily use a form but you'll need to change the lines that read 
' the info back in at the top of the script. 
If iPageCurrent > 1 Then 
    %> 
    <a href="db_paging.asp?page=<%= iPageCurrent - 1 %>&order=<%= Server.URLEncode(strOrderBy) %>">[&lt;&lt; Prev]</a> 
    <% 
End If 

' You can also show page numbers: 
For I = 1 To iPageCount 
    If I = iPageCurrent Then 
     %> 
     <%= I %> 
     <% 
    Else 
     %> 
     <a href="db_paging.asp?page=<%= I %>&order=<%= Server.URLEncode(strOrderBy) %>"><%= I %></a> 
     <% 
    End If 
Next 'I 

If iPageCurrent < iPageCount Then 
    %> 
    <a href="db_paging.asp?page=<%= iPageCurrent + 1 %>&order=<%= Server.URLEncode(strOrderBy) %>">[Next &gt;&gt;]</a> 
    <% 
End If 

' END RUNTIME CODE 
%>