• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

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

    發布: 2007-7-14 19:37 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 12次 | 進入軟件測試論壇討論

    領測軟件測試網 在上兩講中,我們講解了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,這個例子還順帶講解了如何使用循環輸出字段值(而以前我們都是用“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
    %>

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>