• <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 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 13次 | 進入軟件測試論壇討論

    領測軟件測試網 在上一講中,我們學習了如何與數據庫建立連接和從數據庫中檢索數據,今天的內容是如何向數據庫中添加新數據、修改和刪除數據庫中的數據。

    一、 向數據庫中添加新數據
    方法一:使用SQL語句,例wuf50.asp。
    為了簡化以后的程序,將與Access數據庫的連接部分放在一個文件中,此文件以后需要用到時不再說明。
    <% 'AdoAccess.asp
    Option Explicit
    Response.Expires = 0
    '第一部分: 建立連接
    Dim Cnn, StrCnn
    Set Cnn = Server.CreateObject("ADODB.Connection")
    StrCnn = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:\.netpub\home\asp\Northwind.mdb"
    Cnn.Open StrCnn
    %>
    程序wuf50.asp
    <% @LANGUAGE = VBScript %>
    <!--#include file="AdoAccess.asp"-->
    <% ' wuf50.asp
    '第二部分: 使用 Connection 對象的 Execute 添加新數據
    Dim StrSQL, rsTest
    StrSQL = "INSERT INTO 運貨商 (公司名稱,電話) VALUES('wu''feng','0571-7227298')"
    Cnn.Execute StrSQL
    %>
    <HTML>
    <BODY>
    <% '第三部分: 將得到的記錄集顯示到瀏覽器上
    Set rsTest = Cnn.Execute("Select * From 運貨商")
    Do While Not rsTest.EOF    
    Response.Write rsTest(0) & "  "  & rsTest(1) & "  "  & rsTest(2) & "  "  & "<BR>"
        rsTest.MoveNext       
    Loop

    '第四部分: 打掃戰場
    Cnn.close
    Set rsTest = Nothing: Set Cnn = Nothing
    %>
    </BODY>
    </HTML>
    請注意以下幾點:
    1. 使用SQL語句向Access數據庫中添加數據時必須使用Insert Into,而向SQL Server數據庫中添加數據,使用Insert就可以了。
    2. 使用SQL語句添加數據的格式如上例,注意需要添加'wu'feng',在語句中必須使用'wu''feng',因為SQL語句使用'作為字符串的分界符。
    3. 把本例同以前所學的知識結合起來,就可以實現從HTML表單中添加數據。
    4. 注意有一個數據類型為自動編號的字段,如本例中的“運貨商ID”,因此你大可不必考慮如何寫代碼獲得一個遞增的編號。

    方法二:使用Recordset對象的Addnew方法,例wuf51.asp。
    <% @LANGUAGE = VBScript %>
    <!--#include file="AdoAccess.asp"-->
    <!--#include file="adovbs.inc"-->
    <% ' wuf51.asp
    '第二部分: 使用 Recordset 對象的 AddNew 方法添加新數據
    Dim StrSQL, rsTest
    Set rsTest = server.CreateObject("ADODB.Recordset")
    rsTest.CursorType = adOpenKeySet  'adOpenDynamic
    '沒有下面這一句, 將不允許更新數據庫, 為什么?
    rsTest.LockType = adLockOptimistic
    rsTest.Open "運貨商",Cnn,,,adCmdTable

    rsTest.AddNew
    rsTest("公司名稱") = "wu'feng"
    rsTest("電話") = "0571-7227298"
    rsTest.Update
    %>
    <HTML>
    <BODY>
    <% '第三部分: 將得到的記錄集顯示到瀏覽器上
    '將數據庫指針移到表中的第一條記錄
    If Not rsTest.EOF <> 0 Then
    Response.Write "表中現有 [" & rsTest.RecordCount & "] 條數據" & "<Br><Br>"
    rsTest.MoveFirst
    End If

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

    '第四部分: 打掃戰場
    Cnn.close
    Set rsTest = Nothing: Set Cnn = Nothing
    %>
    </BODY>
    </HTML>
    分析:
    1. 為何要設置rsTest.LockType = adLockOptimistic
    Recordset對象的LockType屬性有四個可選值:
    adLockReadOnly——默認值,表示以只讀方式打開記錄集,因而無法無法更改數據,在這種情況下使用AddNew方法就會發生錯誤。
    adLockPessimistic——保守式記錄鎖定(逐條)。采用編輯時立即鎖定數據源的記錄的方式。此時,其他用戶不能訪問該數據。
    adLockOptimistic ——開放式記錄鎖定(逐條)。只在調用 Update 方法時鎖定記錄。想想,這個屬性是不是與我們講過的Application對象的Lock、Unlock屬性的意思差不多。
    adLockBatchOptimistic——開放式批更新。用于成批更新數據,與UpdateBatch方法相對應。
        順便我們再提一下上一講中提到的CursorType 屬性,它同樣有四個值:
    adOpenForwardOnly——僅向前游標,默認值,只能在記錄中向前滾動。這可以節省資源并提高性能。
    adOpenStatic——靜態游標?梢杂脕聿檎覕祿蛏蓤蟾娴挠涗浖系撵o態副本。另外,對其他用戶所作的添加、更改或刪除不可見。 推薦在ASP中只使用這兩種游標。
    adOpenKeyset——鍵集游標。鍵集游標與動態游標相似,不同的只是禁止查看其他用戶添加的記錄,并禁止訪問其他用戶刪除的記錄,其他用戶所作的數據更改將依然可見。
    adOpenDynamic——動態游標?梢钥匆娖渌脩羲鞯奶砑、更改和刪除。允許在記錄集中進行所有類型的移動。
    可以肯定的一定是,這樣抽象的描述有點似是而非,還是弄不太明白,簡單的說,
    (1) 如果僅僅檢索數據,使用默認值就可以了;
    (2) 如果使用Update方法更新一條數據,LockType屬性使用adLockOptimistic,使用UpdataBatch方法成批更新數據,則使用adLockBatchOptimistic。
    (3) 如果對數據庫有寫動作,CursorType 屬性一般使用adOpenKeyset就夠了。
    怎么樣?即使還不太明白,但會用了吧。

    2. 如果你并不精通數據庫,通常在輸出顯示前使用rsTest.MoveFirst將指針移至第一條記錄是大有益處的。但是如果數據庫中沒有任何數據,就無法使用MoveFirst方法,所以使用前先用rsTest.EOF屬性判斷數據庫中是否有數據。
    3. 只有當游標類型設為adOpenKeyset或adOpenStatic時,才能使用RecordCount屬性(獲取記錄集中的記錄數目)。

    二、 修改數據庫中已存在的數據
    方法一:使用 SQL 語句。例wuf52.asp,程序基本上與wuf50.asp類似,這里僅列出關鍵部分。
    '第二部分: 使用 Connection 對象的 Execute 方法修改數據
    Dim StrSQL, rsTest
    StrSQL = "UPDATE 運貨商 SET 電話 = '(503) 555-3188' WHERE 電話 LIKE '%99%'"
    Cnn.Execute StrSQL
        修改數據不用INSERT INTO…VALUES,而是用UPDATE…SET語句,WHERE子句的意思是將含有字符串“99”(“LIKE”、“%”在模糊查詢時經常用到)的電話號碼改為(503) 555-3188,如果不設置條件,表中所有的電話號碼都會被改掉。

    方法二:使用 Recordset 對象的 Update 方法。程序wuf53.asp(類似例程wuf51.asp)
    '第二部分: 使用 Recordset 對象的 Update 方法修改數據
    Dim StrSQL, rsTest
    Set rsTest = server.CreateObject("ADODB.Recordset")
    rsTest.LockType = adLockOptimistic
    StrSQL = "SELECT 姓氏,名字,出生日期 FROM 雇員 WHERE 出生日期 = #55-03-04#"
    rsTest.Open StrSQL, Cnn,,,adCmdText

    rsTest("名字") = "中文"
    rsTest.Update
    分析:
    1. SQL語句中,如果數據庫是Access數據庫,則日期用#55-03-04#括起來,如本例;如果是SQL Server數據庫,則日期要用’55-03-04’括起來。
    2. rsTest.Open StrSQL, Cnn,,,adCmdText中,由于第一個參數是SQL語句,所以第五個參數為adCmdText,其實,第五個參數完全可以省略,但是加上它會使腳本的執行效率更高。
    3. 使用方法一,一次可以更新符合條件的所有記錄(多條記錄或一條記錄),但方法二中的Update只能修改當前記錄(符合條件的第一條記錄)。

    三、 刪除數據庫中的數據
    方法一:使用 SQL 語句。例程wuf55.asp
    '第二部分: 使用 SQL 語句刪除數據
    Dim StrSQL, rsTest
    StrSQL = "DELETE FROM 運貨商 WHERE 電話 = '0571-7227298'"
    Cnn.Execute StrSQL

    方法二:使用 Recordset 對象的 Delete 方法。例程wuf56.asp
    '第二部分: 使用 Recordset 對象的 Delete 方法刪除數據
    Dim StrSQL, rsTest
    Set rsTest = server.CreateObject("ADODB.Recordset")
    rsTest.LockType = adLockOptimistic
    StrSQL = "SELECT * FROM 運貨商 WHERE 電話 = '0571-7227298'"
    rsTest.Open StrSQL, Cnn,,,adCmdText

    While Not rsTest.EOF
    rsTest.Delete
    rsTest.MoveNext
    Wend
        若記錄集中有多條記錄符合條件,則必須使用循環,否則,Delete方法只刪除當前記錄,即第一條符合條件的記錄。

    四、 其它一些有用的知識
    1. 成批更新數據
    上面我們講了如何使用Recordset對象的Update方法更新數據,事實上,Recordset 對象可支持兩類更新:立即更新和批更新。
    使用立即更新,一旦調用 Update 方法,對數據的所有更改將被立即寫入現行數據源。
    使用批更新,可以使提供者將多個記錄的更改存入緩存,然后使用 UpdateBatch 方法在單個調用中將它們傳送給數據庫。更新多個記錄時,批更新比立即更新更有效。
    缺省為立即更新模式。使用批更新模式,要使用客戶端游標,例wuf54.asp。
    <% @LANGUAGE = VBScript %>
    <!--#include file="AdoAccess.asp"-->
    <!--#include file="adovbs.inc"-->
    <% ' wuf54.asp
    '第二部分: 批更新模式
    Dim StrSQL, rsTest
    Set rsTest = server.CreateObject("ADODB.Recordset")
    rsTest.CursorLocation = adUseClient          ‘使用客戶端游標類型
    rsTest.LockType = adLockBatchOptimistic
    StrSQL = "SELECT * FROM 運貨商 WHERE 電話 LIKE '%99%'"
    rsTest.Open StrSQL, Cnn,,,adCmdText

    rsTest.MoveFirst
    While Not rsTest.EOF
    rsTest("公司名稱") = "中文"
    rsTest.MoveNext
    Wend
    rsTest.UpdateBatch
    %>
    <HTML>
    <BODY>
    <% '第三部分: 將得到的記錄集顯示到瀏覽器上
    rsTest.Requery
    Do While Not rsTest.EOF    
    Response.Write rsTest(0) & "  "  & rsTest(1) & "  "  & rsTest(2) & "  "  & "<BR>"
        rsTest.MoveNext       
    Loop

    '第四部分: 打掃戰場
    Cnn.close
    Set rsTest = Nothing: Set Cnn = Nothing
    %>
    </BODY>
    </HTML>
    注意:
    1) rsTest.CursorLocation = adUseClient有兩個值,另一個值為adUseServer(默認),對初學者而言,Recordset對象的游標類型是比較難的部分,這里不再詳細介紹,以免越來越糊涂,請在實際處理中慢慢摸索(多試)。
    2) rsTest.Requery:使用 Requery 方法刷新數據源的 Recordset 對象的全部內容。調用該方法等于相繼調用 Close 和 Open 方法。

    2.學會使用Recordset對象的Filter 屬性
    <% @LANGUAGE = VBScript %>
    <!--#include file="AdoAccess.asp"-->
    <!--#include file="adovbs.inc"-->
    <% ' wuf57.asp
    '第二部分: 使用 Recordset 對象的 Filter 屬性
    Dim StrSQL, rsTest
    Set rsTest = server.CreateObject("ADODB.Recordset")
    rsTest.CursorType = adOpenStatic
    rsTest.LockType = adLockOptimistic
    rsTest.Open "運貨商",Cnn,,,adCmdTable

    '篩選出符合條件的記錄,而其它記錄則被過濾掉
    rsTest.Filter = "公司名稱 = 'wu''feng'"
    If rsTest.EOF Then       ‘若無此記錄,則新增
    rsTest.AddNew
    rsTest("公司名稱") = "wu'feng"
    rsTest("電話") = "0571-7227298"
    rsTest.Update
    Else           ‘若有符合該條件的記錄,修改符合條件的第一條記錄
    rsTest("電話") = "(571) 7227298"
    rsTest.Update
    End If
    %>
    <HTML>
    <BODY>
    <% '第三部分: 將得到的記錄集顯示到瀏覽器上
    '請仔細比較下面這一句要與不要的區別
    'rsTest.Filter=""    '用來清除 Filter 屬性
    rsTest.MoveFirst
    Do While Not rsTest.EOF    
    Response.Write rsTest(0) & "  "  & rsTest(1) & "  "  & rsTest(2) & "  "  & "<BR>"
        rsTest.MoveNext       
    Loop

    '第四部分: 打掃戰場
    Cnn.close
    Set rsTest = Nothing: Set Cnn = Nothing
    %>
    </BODY>
    </HTML>

    3.除了上面介紹的兩種方法之外,還可使用SQL語句、Command對象的Excute方法維護數據庫。例wuf58.asp
    <% @LANGUAGE = VBScript %>
    <!--#include file="AdoAccess.asp"-->
    <!--#include file="adovbs.inc"-->
    <% ' wuf58.asp
    '第二部分: 使用SQL語句、Command對象的Excute方法維護數據庫
    Dim StrSQL, rsTest, cmdChange
    StrSQL = "INSERT INTO 運貨商 (公司名稱,電話) VALUES('wu''feng','0571-7227298')"
      
    ' 創建命令對象。
    Set cmdChange =server.CreateObject("ADODB.Command")
    Set cmdChange.ActiveConnection = Cnn
    cmdChange.CommandText = StrSQL
    cmdChange.Execute
    %>
    <HTML>
    <BODY>
    <% '第三部分: 將得到的記錄集顯示到瀏覽器上
    Set rsTest = server.CreateObject("ADODB.Recordset")
    rsTest.Open "運貨商", Cnn, , , adCmdTable
    Do While Not rsTest.EOF    
    Response.Write rsTest(0) & "  "  & rsTest(1) & "  "  & rsTest(2) & "  "  & "<BR>"
        rsTest.MoveNext       
    Loop

    '第四部分: 打掃戰場
    Cnn.close
    Set rsTest = Nothing: Set Cnn = Nothing
    %>
    </BODY>
    </HTML>

        本講主要介紹了維護數據的三種方法,初學者只要掌握前兩種方法就可以了。一般而言,盡量使用SQL語句解決問題,簡單明了;而使用Recordset對象的最大好處是可以利用其大量的屬性和豐富的游標類型,有更多的選擇,但也給使用帶來一些難題,關鍵在于多摸索,多試驗。

    延伸閱讀

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


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