熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP講座之八:ASP與數據庫(三)

2013-11-13 10:15:47  來源: .NET編程 

   分頁技術
  
  前面我們介紹了如何檢索數據並輸出到浏覽器端對少量數據而言那樣簡單的輸出處理是完全可以的但是若數據量很大有幾百條甚至上千條一次將如此多的數據全部輸出到客戶端是不現實的一來頁面從上到下拉得很長二來客戶端等待的時間過長三來服務器的負載過大所以采取分頁輸出非常必要
  
  要求輸出Northwindmdb產品表中的數據至浏覽器每頁顯示
  
  例wufasp這段代碼還是有點難度的要多看多體會AdoAccessasp在上講中提到過
  
  注該例程吸收了某些書籍中好的部分特此聲明
  <%@ LANGUAGE=VBSCRIPT %>
  <!#include file=AdoAccessasp>
  <!#include file=adovbsinc>
  <%
  Dim RecordPerPage absPageNum TotalPages absRecordNum rsTest StrSQL
  absPageNum  當前頁為第幾頁
  TotalPages  總的頁數
  absRecordNum 當前頁中某一條記錄的序號
  
  RecordPerPage =             每頁顯示的記錄數
  
   取得所輸出數據的 當前頁碼
  If RequestServerVariables(CONTENT_LENGTH) = Then
  若沒收到表單遞交的數據(如首次加載該頁時) 則從第 頁開始顯示
  absPageNum =
  Else
  取出按 按鈕 時的頁碼
  absPageNum = CInt(RequestForm(PressPageNum))
  如按 上一頁 則頁碼 按 下一頁 則頁碼 +
  If RequestForm(Submit) = 上一頁 Then
  absPageNum = absPageNum
  ElseIf RequestForm(Submit) = 下一頁 Then
  absPageNum = absPageNum +
  End If
  End If
  
   創建記錄集對象
  Set rsTest = ServerCreateObject(ADODBRecordset)
  
  rsTestCursorLocation = adUseClient  這樣設置可減輕數據庫負載
  rsTestCursorType = adOpenStatic   游標需要前後移動不能設為僅向前
  rsTestCacheSize = RecordPerPage   設置這個選項會提高性能
  
  StrSQL = SELECT * FROM 產品 Order By 產品ID
  rsTestOpen StrSQL Cnn adCmdText
  
  rsTestPageSize = RecordPerPage   設置每一頁的記錄數
  
  If Not(rsTestEOF) Then
  rsTestAbsolutePage = absPageNum
  End If
  
  TotalPages = rsTestPageCount
  %>
  
  <% 下面部分 輸出當前頁的數據至浏覽器 %>
  <Html><Boby>
  <table colspan= cellpadding= border=>
  <tr>
  <td align=CENTER bgcolor=# width=> <font color=#ffffff size=>單價</font></td>
  <td align=CENTER width= bgcolor=#> <font color=#ffffff size=>產品名稱</font></td>
  </tr>
  <% 用循環輸出當前頁的 條數據
  For absRecordNum = to rsTestPageSize
  %>
  <tr>
  <td bgcolor=fefde align=CENTER> <font size=><%= rsTest(單價)%></font></td>
  <td bgcolor=fefde align=CENTER> <font size=><%= rsTest(產品名稱)%></font></td>
  </tr>
  <%
  rsTestMoveNext
  If rsTestEOF Then
  Exit For     如果已到記錄尾 退出 如最後一頁數據不滿頁時
  End If
  Next
  
  rsTestClose : CnnClose
  Set rsTest = Nothing : Set Cnn = Nothing
  %>
  </table>
  
  <% 下面部分 是兩個按鈕 上一頁 下一頁 %>
  <Form Action = <%= RequestServerVariables(SCRIPT_NAME) %> Method=Post>
  <Input Type=Hidden Name=PressPageNum Value=<%= absPageNum%>>
  <%
  If absPageNum > Then 如果當前不是第一頁 則顯示上一頁按鈕 %>
  <Input Type=Submit Name=Submit Value=上一頁>
  <% End If
  If absPageNum <> TotalPages Then 如果當前頁不是最後一頁 則顯示下一頁按鈕%>
  <Input Type=Submit Name=Submit Value=下一頁>
  <% End If %>
  </Form>
  <P><Center> [ 第 <font color=#CC><%= absPageNum %></font> 頁
  共 <font color=#CC><%= TotalPages %></font> 頁 ] </Center></P>
  </BODY></HTML>
  分析
  .Recordset對象一些有用的屬性
  l rsTestCursorLocation = adUseClient也可以不要這句但這樣做可以減輕數據庫負載
  l rsTestCacheSize = RecordPerPageCacheSize屬性用來決定每次用戶端從數據庫服務器取得的數據多少
  l rsTestPageSizePageSize屬性用來設置每一頁記錄數的多少
  l rsTestAbsolutePageAbsolutePage屬性設置當前數據在Recordset對象中的絕對頁數
  l rsTestPageCountPageCount屬性用來獲取記錄集的總頁數
  .本例Form表單中使用了一個隱含字段PressPageNum 用來傳遞點擊按鈕時為第幾頁
  
   錯誤處理
  
  代碼執行的過程中可能因各種原因發生錯誤代碼本身有問題網絡斷開等等所以在程序中設置錯誤捕獲和處理是非常必要的在ASP中我們可以通過Connection對象的Errors數據集合取得代碼運行時所發生的錯誤或警告信息其使用方法如下
  . 直接對Connection對象來使用
  Set Errs = CnnErrors
  或者
  CnnErrors
  . 建立Recordset對象或Command對象後再通過其ActiveConnection屬性來使用Connection對象
  Set Errs = rsTestActiveConnectionErrors
  或者
  rsTestActiveConnectionErrors
  說起來太粗象舉一實例吧wufasp
  <%@ LANGUAGE=VBSCRIPT %>
  <% Option Explicit %>
  <!#include file=adovbsinc>
  <%
  ResponseExpires =
  下面這句保證: 即使腳本遇到錯誤 也繼續執行下一句
  On Error Resume Next
  
  Dim Cnn rsTest Errs I
  Set Cnn = ServerCreateObject(ADODBConnection)
  CommandTimeout 與數據庫連接的最長等待時間 缺省為
  CnnCommandTimeout =
  你可以分別在下面三種情況下檢測錯誤發生情況 以SQL Server為例
   完全正確; 未設置初始數據庫; 數據庫名誤為 pvbs
  
  CnnOpen Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pubs; Data Source=ICBCZJP
  CnnOpen Provider=sqloledb; User ID=sa; Password=; Initial Catalog=; Data Source=ICBCZJP
  CnnOpen Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pvbs; Data Source=ICBCZJP
  
  For I = To CnnErrorsCount
  Source屬性表示造成錯誤的來源
  ResponseWrite [ & CnnErrors(I)Source & ]
  Description屬性表示錯誤發生原因或描述
  ResponseWrite CnnErrors(I)Description & <br>
  Next
  
  If CnnErrorsCount > Then
  ResponseWrite 連接時發生 & CnnErrorsCount & 個錯誤 & <br>
  End If
  
  Set rsTest = ServerCreateObject(ADODBRecordset)
  rsTestOpen jobsCnnadOpenForwardOnlyadLockReadOnlyadCmdTable
  
  If rsTestActiveConnectionErrorsCount > Then
  Set Session(Errs) = rsTestActiveConnectionErrors
  ResponseRedirect ErrorHandleasp
  End If
  
  CnnClose
  Set rsTest = Nothing : Set Cnn = Nothing
  %>
  ErrorHandleasp代碼
  <%
  Dim I
  For I = To Session(Errs)Count
  ResponseWrite [ & Session(Errs)(I)Source & ]
  ResponseWrite Session(Errs)(I)Description & <br>
  Next
  %>
  分析
  在本例中錯誤可能在連接時發生也可能連接是正確的但是在使用Recordset對象時發生了錯誤
  
  另外在後面的一段代碼中將錯誤集合放入一個會話對象中以便在頁面之間調用(遇到錯誤時轉向錯誤處理頁面ErrorHandleasp)
  
  實際上你也完全可以將Recordset對象賦給Session對象以實現記錄集在頁面之間的調用
  
   使用事務
  
  事務這一概念是非常簡單和重要的為了說明其用途先假設出現了以下情況例如在電子商務中在網上進行貨幣轉帳時必須從某一帳戶中減去某個數額並將其對等數額添加到另一個帳戶無論其中的哪個更新失敗都將導致帳戶收支不平衡(要麼這邊扣了那邊沒有增加要麼這邊沒扣那邊卻增加了)如果使用事務進行這些更改便可確保只能選擇進行全部更改或不作任何更改(不是被完全正確執行就是被全部取消)
  
  事務隸屬於Connection對象
From:http://tw.wingwit.com/Article/program/net/201311/13103.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.