在上一講中,我們學習了如何與資料庫建立串連和從資料庫中檢索資料,今天的內容是如何向資料庫中添加新資料、修改和刪除資料庫中的資料。
一、 向資料庫中添加新資料 方法一:使用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:\Inetpub\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——靜態資料指標。可以用來尋找資料或產生報告的記錄集合的靜態副本。另外,對其他使用者所作的添加、更改或刪除不可見。 推薦在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對象的最大好處是可以利用其大量的屬性和豐富的遊標類型,有更多的選擇,但也給使用帶來一些難題,關鍵在於多摸索,多實驗。 |