<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      ASP知識講座8

      [摘要]ASP與數據庫(三)在上兩講中,我們講解了ASP中數據庫的基本使用,今天將介紹幾種非常實用的技術。一、 分頁技術前面我們介紹了如何檢索數據并輸出到瀏覽器端,對少量數據而言,那樣簡單的輸出處理是完全可...

      ASP與數據庫(三)

      在上兩講中,我們講解了ASP中數據庫的基本使用,今天將介紹幾種非常實用的技術。

      一、 分頁技術
      前面我們介紹了如何檢索數據并輸出到瀏覽器端,對少量數據而言,那樣簡單的輸出處理是完全可以的,但是若數據量很大,有幾百條甚至上千條,一次將如此多的數據全部輸出到客戶端是不現實的,一來頁面從上到下拉得很長,二來客戶端等待的時間過長,三來服務器的負載過大。所以采取分頁輸出非常必要。
      要求:輸出Northwind.mdb"產品"表中的數據至瀏覽器,每頁顯示10條。
      例wuf60.asp,這段代碼還是有點難度的,要多看多體會,AdoAccess.asp在上講中提到過。
      注:該例程吸收了某些書籍中好的部分,特此聲明。
      <%@ LANGUAGE="VBSCRIPT" %>
      <!--#include file="AdoAccess.asp"-->
      <!--#include file="adovbs.inc"-->
      <%
      Dim RecordPerPage, absPageNum, TotalPages, absRecordNum, rsTest, StrSQL
      'absPageNum - 當前頁為第幾頁
      'TotalPages - 總的頁數
      'absRecordNum - 當前頁中某一條記錄的序號, 如 1-10

      RecordPerPage = 10 '每頁顯示的記錄數

      ' 取得所輸出數據的 當前頁碼
      If Request.ServerVariables("CONTENT_LENGTH") = 0 Then
      '若沒收到表單遞交的數據(如首次加載該頁時), 則從第 1 頁開始顯示
      absPageNum = 1 
      Else
      '取出按 按鈕 時的頁碼 
      absPageNum = CInt(Request.Form("PressPageNum"))
      '如按 上一頁 則頁碼 -1, 按 下一頁, 則頁碼 +1
      If Request.Form("Submit") = "上一頁" Then
      absPageNum = absPageNum - 1
      ElseIf Request.Form("Submit") = "下一頁" Then
      absPageNum = absPageNum + 1
      End If
      End If

      ' 創建記錄集對象
      Set rsTest = Server.CreateObject("ADODB.Recordset")

      rsTest.CursorLocation = adUseClient '這樣設置可減輕數據庫負載
      rsTest.CursorType = adOpenStatic '游標需要前后移動,不能設為僅向前
      rsTest.CacheSize = RecordPerPage '設置這個選項會提高性能

      StrSQL = "SELECT * FROM 產品 Order By 產品ID"
      rsTest.Open StrSQL, Cnn, , , adCmdText

      rsTest.PageSize = RecordPerPage '設置每一頁的記錄數

      If Not(rsTest.EOF) Then
      rsTest.AbsolutePage = absPageNum
      End If

      TotalPages = rsTest.PageCount
      %>

      <% ' 下面部分 輸出當前頁的數據至瀏覽器 %>
      <Html><Boby>
      <table colspan=8 cellpadding=5 border=0>
      <tr> 
      <td align=CENTER bgcolor="#800000" width="109"> <font style="ARIAL NARROW" color="#ffffff" size="2">單價</font></td>
      <td align=CENTER width=459 bgcolor="#800000"> <font style="ARIAL NARROW" color="#ffffff" size="2">產品名稱</font></td>
      </tr>
      <% ' 用循環輸出當前頁的 10 條數據
      For absRecordNum = 1 to rsTest.PageSize
      %>
      <tr> 
      <td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("單價")%></font></td>
      <td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("產品名稱")%></font></td>
      </tr>
      <%
      rsTest.MoveNext
      If rsTest.EOF Then
      Exit For ' 如果已到記錄尾, 退出 - 如最后一頁數據不滿頁時
      End If
      Next

      rsTest.Close : Cnn.Close
      Set rsTest = Nothing : Set Cnn = Nothing
      %>
      </table>

      <% ' 下面部分 是兩個按鈕 "上一頁" "下一頁" %>
      <Form Action = "<%= Request.ServerVariables("SCRIPT_NAME") %>" Method="Post">
      <Input Type="Hidden" Name="PressPageNum" Value="<%= absPageNum%>">
      <%
      If absPageNum > 1 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="#CC0033"><%= absPageNum %></font> 頁, 
      共 <font color="#CC0033"><%= TotalPages %></font> 頁 ] </Center></P>
      </BODY></HTML>
      分析:
      1.Recordset對象一些有用的屬性:
      l rsTest.CursorLocation = adUseClient:也可以不要這句,但這樣做可以減輕數據庫負載;
      l rsTest.CacheSize = RecordPerPage:CacheSize屬性用來決定每次用戶端從數據庫服務器取得的數據多少;
      l rsTest.PageSize:PageSize屬性用來設置每一頁記錄數的多少;
      l rsTest.AbsolutePage:AbsolutePage屬性設置當前數據在Recordset對象中的絕對頁數;
      l rsTest.PageCount:PageCount屬性用來獲取記錄集的總頁數。
      2.本例Form表單中使用了一個隱含字段PressPageNum 用來傳遞點擊按鈕時為第幾頁。

      二、 錯誤處理
      代碼執行的過程中,可能因各種原因發生錯誤,如:代碼本身有問題、網絡斷開等等,所以在程序中設置錯誤捕獲和處理是非常必要的。在ASP中,我們可以通過Connection對象的Errors數據集合取得代碼運行時所發生的錯誤或警告信息,其使用方法如下:
      1. 直接對Connection對象來使用:
      Set Errs = Cnn.Errors
      或者
      Cnn.Errors
      2. 建立Recordset對象或Command對象后,再通過其ActiveConnection屬性來使用Connection對象:
      Set Errs = rsTest.ActiveConnection.Errors
      或者
      rsTest.ActiveConnection.Errors
      說起來太粗象,舉一實例吧:wuf61.asp
      <%@ LANGUAGE="VBSCRIPT" %>
      <% Option Explicit %>
      <!--#include file="adovbs.inc"-->
      <%
      Response.Expires = 0
      '下面這句保證: 即使腳本遇到錯誤, 也繼續執行下一句
      On Error Resume Next

      Dim Cnn, rsTest, Errs, I
      Set Cnn = Server.CreateObject("ADODB.Connection")
      'CommandTimeout - 與數據庫連接的最長等待時間, 缺省為15秒
      Cnn.CommandTimeout = 5
      '你可以分別在下面三種情況下檢測錯誤發生情況 - 以SQL Server為例
      '1 - 完全正確; 2 - 未設置初始數據庫; 3 - 數據庫名誤為 pvbs

      Cnn.Open "Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pubs; Data Source=ICBCZJP"
      'Cnn.Open "Provider=sqloledb; User ID=sa; Password=; Initial Catalog=; Data Source=ICBCZJP"
      'Cnn.Open "Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pvbs; Data Source=ICBCZJP"

      For I = 0 To Cnn.Errors.Count - 1
      'Source屬性表示造成錯誤的來源
      Response.Write "[ " & Cnn.Errors(I).Source & " ] "
      'Description屬性表示錯誤發生原因或描述
      Response.Write Cnn.Errors(I).Description & "<br>"
      Next

      If Cnn.Errors.Count > 0 Then
      Response.Write "連接時發生 " & Cnn.Errors.Count & " 個錯誤" & "<br>"
      End If

      Set rsTest = Server.CreateObject("ADODB.Recordset")
      rsTest.Open "jobs",Cnn,adOpenForwardOnly,adLockReadOnly,adCmdTable

      If rsTest.ActiveConnection.Errors.Count > 0 Then
      Set Session("Errs") = rsTest.ActiveConnection.Errors
      Response.Redirect "ErrorHandle.asp"
      End If

      Cnn.Close
      Set rsTest = Nothing : Set Cnn = Nothing
      %>
      ErrorHandle.asp代碼:
      <%
      Dim I
      For I = 0 To Session("Errs").Count - 1
      Response.Write "[ " & Session("Errs")(I).Source & " ] "
      Response.Write Session("Errs")(I).Description & "<br>"
      Next
      %>
      分析:
      在本例中,錯誤可能在連接時發生,也可能連接是正確的,但是在使用Recordset對象時發生了錯誤。
      另外,在后面的一段代碼中,將錯誤集合放入一個會話對象中,以便在頁面之間調用(遇到錯誤時,轉向錯誤處理頁面ErrorHandle.asp)。
      實際上,你也完全可以將Recordset對象賦給Session對象,以實現記錄集在頁面之間的調用。

      三、 使用事務
      事務這一概念是非常簡單和重要的,為了說明其用途,先假設出現了以下情況:例如在電子商務中,在網上進行貨幣轉帳時,必須從某一帳戶中減去某個數額并將其對等數額添加到另一個帳戶。無論其中的哪個更新失敗,都將導致帳戶收支不平衡(要么這邊扣了,那邊沒有增加;要么這邊沒扣,那邊卻增加了)。如果使用事務進行這些更改,便可確保只能選擇進行全部更改或不作任何更改(不是被完全正確執行,就是被全部取消)。 
      事務隸屬于Connection對象,Connection對象有三個與事務有關的方法:
      l BeginTrans 啟動新的事務。
      l CommitTrans 保存所有更改并結束當前事務。
      l RollbackTrans 取消當前事務中所做的任何更改并結束事務,通常稱為"回滾"。
      我們不妨看一個實例wuf62.asp。
      <%@ LANGUAGE="VBSCRIPT" %>
      <% Option Explicit %>
      <!--#include file="adovbs.inc"-->
      <%
      Response.Expires = 0
      On Error Resume Next

      Dim Cnn, StrSQL, rsTest
      Set Cnn = Server.CreateObject("ADODB.Connection")
      Cnn.Open "Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pubs; Data Source=ICBCZJP"

      '開始一個事務
      Cnn.BeginTrans
      StrSQL = "Insert jobs(job_desc, min_lvl, max_lvl) Values('金融',16,86)" 
      Cnn.Execute StrSQL

      '下面第一句語句錯誤, 第二句正確
      StrSQL = "Update jobs_err SET job_desc = '事務' Where job_id = 14" 
      'StrSQL = "Update jobs SET job_desc = '事務' Where job_id = 14" 
      Cnn.Execute StrSQL

      If Cnn.Errors.Count > 0 Then
      Response.Write "發生錯誤, 系統恢復事務開始時的狀態, 既不會新增, 也不會修改" & "<br>"
      Cnn.RollbackTrans
      Else
      Response.Write "沒有錯誤, 保存對數據庫的更改, 新增一條數據, 修改一條數據" & "<br>"
      Cnn.CommitTrans
      End If

      Set rsTest = Cnn.Execute("Select * From jobs where job_id>=14")
      While Not rsTest.EOF
      Response.Write rstest(0) & rstest(1) & rstest(2) & rstest(3) & "<br>"
      rsTest.MoveNext
      Wend

      '該例僅為測試, 故恢復數據庫原來數據
      Cnn.Execute "Update jobs SET job_desc = 'Designer' Where job_id = 14"
      Cnn.Execute "DELETE jobs Where job_id > 14"

      Cnn.Close: Set Cnn = Nothing
      %>
      本例中,新增(Insert)和修改(Update)要么同時發生,要么都不發生,不會出現新增一條數據,而修改卻因為語句錯誤未發生的情況。在數據庫編程時使用事務是一個非常好的習慣。

      四、多個記錄集的處理
      有時候我們需要同時取得兩個表的數據,如果放在一條SQL語句中返回,則可以減少網絡傳輸并提高運行效率。
      例wuf64.asp,這個例子還順帶講解了如何使用循環輸出字段值(而以前我們都是?quot;rsTest(0) & rsTest(1) & …"這樣的笨方法輸出的,如果只有兩三個字段,用這種方法顯然更簡潔),如果一時看不明白,請下載簡單一點的wuf63.asp,切記!。
      <%@ LANGUAGE="VBSCRIPT" %>
      <%
      Option Explicit
      Response.Expires = 0

      Dim Cnn, StrSQL, rsTest, I
      Set Cnn = Server.CreateObject("ADODB.Connection")
      Cnn.Open "Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pubs; Data Source=ICBCZJP"

      Set rsTest = Server.CreateObject("ADODB.Recordset")

      '檢索多個記錄集
      StrSQL = "Select COUNT(*) AS '雇員數' From employee; Select * From jobs" 
      rsTest.Open StrSQL, Cnn ', , ,adCmdText

      While Not rsTest Is Nothing
      Response.Write "<Table Border = 2><tr>"

      'rsTest.Fields.Count - 記錄集字段個數
      For I = 0 To rsTest.Fields.Count - 1
      'rsTest(I).Name - 第 I 個字段的字段名
      Response.Write "<td>" & rsTest(I).Name & "</td>"
      Next
      Response.Write "</tr>"

      While Not rsTest.EOF
      Response.Write "<tr>"
      '用循環輸出每一個字段的值
      For I = 0 To rsTest.Fields.Count - 1
      Response.Write "<td>" & rsTest(I) & "</td>"
      Next
      Response.Write "</tr>"
      rsTest.MoveNext
      Wend

      '讀取下一個Recordset對象
      Set rsTest = rsTest.NextRecordset
      Wend

      Cnn.Close
      Set rsTest = Nothing: Set Cnn = Nothing
      %>
      說明:SQL Server數據庫支持多個記錄集,而Access數據庫不支持。

      五、 盡早關閉連接,釋放資源
      在以往的例子中,都是最后關閉連接,然而Connection對象要占用資源,事實上,按下面wuf65.asp所提供的方法,完全可以更早一點關閉連接。
      <% @LANGUAGE = VBScript %>
      <!--#include file="AdoAccess.asp"-->
      <!--#include file="adovbs.inc"-->
      <% ' wuf65.asp
      Dim StrSQL, rsTest

      StrSQL = "Select * From 運貨商"
      Set rsTest = server.CreateObject("ADODB.Recordset")
      '一定要使用客戶端游標, 否則不行
      rsTest.CursorLocation = adUseClient
      rsTest.Open StrSQL,Cnn,,,adCmdText

      '刪除記錄集對 Connection 對象的依賴
      Set rsTest.ActiveConnection = Nothing
      '盡可能早的關閉連接
      Cnn.close: Set Cnn = Nothing

      Do While Not rsTest.EOF 
      Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
      rsTest.MoveNext 
      Loop
      Set rsTest = Nothing
      %>



      標簽:ASP知識講座8 
      日韩精品一区二区三区高清