用GetRows或GetString來提高ASP的速度

來源:互聯網
上載者:User

<!--#include file="include/DBConn.asp"--> 
<% 
'''''''''''''''基本的GetRows的使用'''''''''''''''''''' 
Call DBConnBegin() 
Set Rs = Server.CreateObject("ADODB.RecordSet") 
Sql = "Select top 10 id,AreaCode,AreaName,EnglishName from Info_Hotel" 
Rs.Open Sql,conn,1,1 
RecList = Rs.GetRows() 
Rs.Close 
   

%> 
<table width="600" border="0" cellspacing="0" cellpadding="0"> 
<%For i = 0 To Ubound(RecList,2)%> 
  <tr> 
    <td><%=RecList(0,i)%></td> 
    <td><%=RecList(2,i)%></td> 
    <td><%=RecList(3,i)%></td> 
  </tr> 
<%Next%> 
</table> 

<% 
''''''通過getrows實現資料庫記錄分頁的一段代碼-------------------- 
  Dim iStart, iOffset 
  iStart = Request("Start") 
  iOffset = Request("Offset") 
  if Not IsNumeric(iStart) or Len(iStart) = 0 then 
    iStart = 0 
  else 
    iStart = CInt(iStart) 
  end if 
  if Not IsNumeric(iOffset) or Len(iOffset) = 0 then 
    iOffset = 30 
  else 
    iOffset = Cint(iOffset) 
  end if 
  Response.Write "Viewing " & iOffset & " records starting at record " & iStart & "<BR>" 
  Dim objConn, objRS 
  Set objConn = Server.CreateObject("ADODB.Connection") 
  'objConn.Open "DSN=MP3" 
dim connstr 
字串9 
dim db 
db="csnjimageman.mdb" 
connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&db&"") 
objconn.Open connstr 
  Set objRS = Server.CreateObject("ADODB.Recordset") 
  objRS.Open "SELECT * FROM imageinfo", objConn 
  Dim aResults 
  aResults = objRS.GetRows 
  objRS.Close 
  Set objRS = Nothing 
  objConn.Close 
  Set objConn = Nothing 

  Dim iRows, iCols, iRowLoop, iColLoop, iStop 
  iRows = UBound(aResults, 2) 
  iCols = UBound(aResults, 1) 
  If iRows > (iOffset + iStart) Then 
    iStop = iOffset + iStart - 1 
  Else 
    iStop = iRows 
  End If 
  For iRowLoop = iStart to iStop 
    For iColLoop = 0 to iCols 
      Response.Write aResults(iColLoop, iRowLoop) & " " 
字串5 

    Next 
    Response.Write "<BR>" 
  Next   
  Response.Write "<P>" 
  if iStart > 0 then 
    'Show Prev link 
    Response.Write "<A HREF=""GetRows.asp?Start=" & iStart-iOffset & _ 
                   "&Offset=" & iOffset & """>Previous " & iOffset & "</A>" 
  end if 
  if iStop < iRows then 
    'Show Next link 
    Response.Write " <A HREF=""GetRows.asp?Start=" & iStart+iOffset & _ 
                   "&Offset=" & iOffset & """>Next " & iOffset & "</A>" 
  end if 
%> 

------------------------------------------------------- 

ADO也提供更有效率方法來取得資料。GetRows 方法傳回一個二維的陣列變數,每一行對應Recordset中的一筆記錄,且每一列對應到記錄中的欄位。此方法的文法如下: 

varArray = rs.GetRows([Rows], [Start], [Fields]) 

Rows 是要讀取記錄的數量;如果想要取得Recordset所有記錄,可用-1或省略此參數。Start 是指出第一個被讀取記錄的書籤;也可以是下列列舉常數中的一個:0-adBookmarkCurrent(目前記錄)、1-adBookmarkFirst(第一筆記錄)、或2- adBookmarkLast(最後記錄)。 

Fields 是可選擇的欄位名稱數組,其用來限制要讀取的資料量。(也可指定單一欄位名稱、單一欄位索引、或者一個欄位索引數組)。當設定 Rows 為少於Recordset記錄筆數時,第一筆未讀取的記錄變成現行記錄。若省略 Rows 參數或設定為-1-adGetRowsRest 或大於未讀取的筆數時,GetRows 方法會讀取所有記錄並讓Recordset在EOF狀態,而不會產生任何錯誤。 

當處理目的變數數組的資料時,應該記得資料儲存方式是有點相反的感覺:數組中第一維定義Recordset的欄位(資料行),第二維定義Recordset的資料列。以下有個載入Recordset內所有記錄某三個欄位的範例: 

Dim values As Variant, fldIndex As Integer, recIndex As Integer 
values = rs.GetRows(, , Array("LastName", "FirstName", "BirthDate")) 
For recIndex = 0 To UBound(values, 2) 
    For fldIndex = 0 To UBound(values) 
        Print values(fldIndex, recIndex), 
    Next 
    Print 
Next 

GetRows 方法通常比一次讀一筆記錄的迴圈要來得快些,但使用這方法時,必須確定Recordset未包含太多記錄;否則,會很容易以一個非常大的變數數組來填滿所有記憶體。基於相同的原因,得小心不要包括任何BLOB(Binary Large Object)或 CLOB(Character Large Object)欄位;若如此做的化,應用程式一定會爆掉,特別是對於較大的Recordset而言。最後,記住此方法傳回的變數數組是以0為基底的;傳回記錄的筆數是UBound(values,2)+1,傳回欄位數是UBound(value, 1)+1。 

GetString 方法跟 GetRows 是類似的,不過其傳回以單一字串形式存在的多重記錄。GetString 文法如下: 

GetString([Format], [NumRows], [ColDelimiter], [RowDelimiter], [NullExpr]) 

Format 是結果的格式。GetString 還可能支援更多格式,但是目前唯一支援的格式是2- adClipString,所以實際上沒有任何選擇。NumRows 是要取得的列數。(使用-1或省略此參數來讀取所有剩下的記錄。)ColDelimiter 是行的分隔字元(預設為Tab字元)。 RowDelimiter 為記錄的分隔字元(預設為換行字元)。NullExpr 是用來表示Null欄位的字串(預設為空白字串)。檔案中說明只有當Format= adClipString時,最後三個參數才可使用,但是這警告沒有多大意義,因為(如之前所提)此格式是目前唯一支援的。以下有個例子,其透過 GetString 方法來將資料匯出成以分號分隔的文字檔案: 

Dim i As Long 
Open "datafile.txt" For Output As #1 
For i = 0 To rs.Fields.Count _ 1          ’ Export field names. 
    If i > 0 Then Print #1, ";"; 
    Print #1, rs.Fields(i).Name; 
Next 
Print #1, "" 
rs.MoveFirst                              ’ Export data. 
Print #1, rs.GetString(, , ";", vbCrLf);  ’ Don’t add an extra CR-LF here. 
Close #1 

GetString 方法不允許只匯出欄位的子集合,也不允許修改匯出欄位的順序。如果需要這些額外的功能,應該使用 GetRows 方法且自行建立結果字串。
 
 
 
 
 
 
 
 
 
 
-------------用GetString來提高ASP的速度-------------------------
 
 
 
許多ASP程式員都有過執行資料庫查詢,然後將查詢結果用HTML表格的形式顯示出來的經曆吧。通常我們是這麼做的:  

以下為引用的內容: <%
'Create connection / recordset
'Populate data into recordset object
%>
<TABLE>
<% Do While not rs.EOF %>
<TR>
<TD ><%=rs("Field1")% ></TD>
<TD ><%=rs("Field2")% ></TD>
.
</TR>
<% rs.MoveNext
Loop %>
</TABLE>
如果查詢結果很多,伺服器解釋你的ASP script將花費大量的時間,因為有許多的
Response.Write語句要處理. 如果你將輸出的全部結果放在一個很長的字串裡(從<TABLE >到</TABLE >),那麼伺服器只需解釋一遍Response.Write語句,速度就會快得多 . 微軟公司裡的一些能乾的傢伙已經將想法變成了現實. (注意,這是一個ADO 2.0以上才有 的特性. 如果你還在使用以前版本的話,請升級到最新版)
有了GetString方法,我們就可以僅用一個Response.Write來顯示所有的輸出了,它就象 是能判斷Recordset是否為EOF的DO ... LOOP迴圈. 
GetString的用法如下(所有的參數都是可選的): 

以下為引用的內容: String = recordset.GetString(StringFormat,
 NumRows,
 ColumnDelimiter,
 RowDelimiter, NullExpr) 
要從Recordset的結果裡產生HTML表格,我們只需關心GetString的5個參數中的3個: 
ColumnDelimiter(分隔記錄集的列的HTML代碼),RowDelimiter(分隔記錄集的行的HTML 代碼),和NullExpr(目前記錄為空白時應產生的HTML代碼). 就象你在下面產生HTML表格的 例子裡所看到的那樣,每列用<TD >...</TD >分隔,每行用<TR >...</TR >分隔. 來 看看例子的代碼吧. 

以下為引用的內容:  <%@ LANGUAGE="VBSCRIPT" %>
<% Option Explicit 'Good coding technique
'Establish connection to DB
Dim conn
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DSN=Northwind;"
'Create a recordset
Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM table1", conn
'Store our one big string
Dim strTable
strTable = rs.GetString(,,"</td ><td >","</td ></tr ><tr ><td >"
," ")
%>
<HTML>
<BODY>
<TABLE>
<TR ><TD>
<% Response.Write(strTable) %>
</TR ></TD>
</TABLE>
</BODY>
</HTML>
<%
'Cleanup!
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
%>
strTable字串用於存放我們從"SELECT * FROM table1"結果產生的HTML表格的代碼. 
HTML表格的每列之間都將有</td ><td >的HTML代碼,每行之間的HTML代碼是</td ></td ><tr ><td >. GetString方法將輸出正確的HTML代碼並存放在strTable中,這樣我們只需一行Response.Write便可以輸出資料集中的所有記錄. 讓我們來看個簡單的例 子,假設我們的查詢結果返回了以下的行和列: 

以下為引用的內容:  Col1 Col2 Col3
Row1 Bob Smith 40
Row1 Ed Frank 43
Row1 Sue Void 42
那麼GetString語句返回的字串將是: 

以下為引用的內容: Bob</td ><td >Smith</td ><td >40</td ><td ></td ></tr ><tr ><
td
>Ed ...

說實話,這個字串看上去冗長而雜亂,但它就是我們想要的HTML代碼. (注意看,我們在 手工書寫的HTML代碼中,將<TABLE ><TR ><TD >放在Response.Write的前面,將</TD ></TR ></TABLE >放在它的後面. 這是因為我們的格式化字串中並不含有這些表格 頭尾所需的字串.)

 

轉自:http://nyazheng.blog.163.com/blog/static/5712646520088554940528/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.