明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

ASP知識(shí)講座7

[摘要]ASP與數(shù)據(jù)庫(kù)(二)在上一講中,我們學(xué)習(xí)了如何與數(shù)據(jù)庫(kù)建立連接和從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù),今天的內(nèi)容是如何向數(shù)據(jù)庫(kù)中添加新數(shù)據(jù)、修改和刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)。一、 向數(shù)據(jù)庫(kù)中添加新數(shù)據(jù)方法一:使用SQL語(yǔ)句,...

ASP與數(shù)據(jù)庫(kù)(二)

在上一講中,我們學(xué)習(xí)了如何與數(shù)據(jù)庫(kù)建立連接和從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù),今天的內(nèi)容是如何向數(shù)據(jù)庫(kù)中添加新數(shù)據(jù)、修改和刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)。

一、 向數(shù)據(jù)庫(kù)中添加新數(shù)據(jù)
方法一:使用SQL語(yǔ)句,例wuf50.asp。
為了簡(jiǎn)化以后的程序,將與Access數(shù)據(jù)庫(kù)的連接部分放在一個(gè)文件中,此文件以后需要用到時(shí)不再說(shuō)明。
<% '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 對(duì)象的 Execute 添加新數(shù)據(jù)
Dim StrSQL, rsTest
StrSQL = "INSERT INTO 運(yùn)貨商 (公司名稱,電話) VALUES('wu''feng','0571-7227298')"
Cnn.Execute StrSQL
%>
<HTML>
<BODY>
<% '第三部分: 將得到的記錄集顯示到瀏覽器上
Set rsTest = Cnn.Execute("Select * From 運(yùn)貨商")
Do While Not rsTest.EOF 
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext 
Loop

'第四部分: 打掃戰(zhàn)場(chǎng)
Cnn.close
Set rsTest = Nothing: Set Cnn = Nothing
%>
</BODY>
</HTML>
請(qǐng)注意以下幾點(diǎn):
1. 使用SQL語(yǔ)句向Access數(shù)據(jù)庫(kù)中添加數(shù)據(jù)時(shí)必須使用Insert Into,而向SQL Server數(shù)據(jù)庫(kù)中添加數(shù)據(jù),使用Insert就可以了。
2. 使用SQL語(yǔ)句添加數(shù)據(jù)的格式如上例,注意需要添加'wu'feng',在語(yǔ)句中必須使用'wu''feng',因?yàn)镾QL語(yǔ)句使用'作為字符串的分界符。
3. 把本例同以前所學(xué)的知識(shí)結(jié)合起來(lái),就可以實(shí)現(xiàn)從HTML表單中添加數(shù)據(jù)。
4. 注意有一個(gè)數(shù)據(jù)類型為自動(dòng)編號(hào)的字段,如本例中的"運(yùn)貨商ID",因此你大可不必考慮如何寫(xiě)代碼獲得一個(gè)遞增的編號(hào)。

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

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

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

'第四部分: 打掃戰(zhàn)場(chǎng)
Cnn.close
Set rsTest = Nothing: Set Cnn = Nothing
%>
</BODY> 
</HTML>
分析:
1. 為何要設(shè)置rsTest.LockType = adLockOptimistic
Recordset對(duì)象的LockType屬性有四個(gè)可選值:
adLockReadOnly--默認(rèn)值,表示以只讀方式打開(kāi)記錄集,因而無(wú)法無(wú)法更改數(shù)據(jù),在這種情況下使用AddNew方法就會(huì)發(fā)生錯(cuò)誤。
adLockPessimistic--保守式記錄鎖定(逐條)。采用編輯時(shí)立即鎖定數(shù)據(jù)源的記錄的方式。此時(shí),其他用戶不能訪問(wèn)該數(shù)據(jù)。
adLockOptimistic --開(kāi)放式記錄鎖定(逐條)。只在調(diào)用 Update 方法時(shí)鎖定記錄。想想,這個(gè)屬性是不是與我們講過(guò)的Application對(duì)象的Lock、Unlock屬性的意思差不多。
adLockBatchOptimistic--開(kāi)放式批更新。用于成批更新數(shù)據(jù),與UpdateBatch方法相對(duì)應(yīng)。
順便我們?cè)偬嵋幌律弦恢v中提到的CursorType 屬性,它同樣有四個(gè)值:
adOpenForwardOnly--僅向前游標(biāo),默認(rèn)值,只能在記錄中向前滾動(dòng)。這可以節(jié)省資源并提高性能。 
adOpenStatic--靜態(tài)游標(biāo)?梢杂脕(lái)查找數(shù)據(jù)或生成報(bào)告的記錄集合的靜態(tài)副本。另外,對(duì)其他用戶所作的添加、更改或刪除不可見(jiàn)。 推薦在ASP中只使用這兩種游標(biāo)。
adOpenKeyset--鍵集游標(biāo)。鍵集游標(biāo)與動(dòng)態(tài)游標(biāo)相似,不同的只是禁止查看其他用戶添加的記錄,并禁止訪問(wèn)其他用戶刪除的記錄,其他用戶所作的數(shù)據(jù)更改將依然可見(jiàn)。
adOpenDynamic--動(dòng)態(tài)游標(biāo)?梢钥匆(jiàn)其他用戶所作的添加、更改和刪除。允許在記錄集中進(jìn)行所有類型的移動(dòng)。 
可以肯定的一定是,這樣抽象的描述有點(diǎn)似是而非,還是弄不太明白,簡(jiǎn)單的說(shuō),
(1) 如果僅僅檢索數(shù)據(jù),使用默認(rèn)值就可以了;
(2) 如果使用Update方法更新一條數(shù)據(jù),LockType屬性使用adLockOptimistic,使用UpdataBatch方法成批更新數(shù)據(jù),則使用adLockBatchOptimistic。
(3) 如果對(duì)數(shù)據(jù)庫(kù)有寫(xiě)動(dòng)作,CursorType 屬性一般使用adOpenKeyset就夠了。
怎么樣?即使還不太明白,但會(huì)用了吧。

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

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

方法二:使用 Recordset 對(duì)象的 Update 方法。程序wuf53.asp(類似例程wuf51.asp)
'第二部分: 使用 Recordset 對(duì)象的 Update 方法修改數(shù)據(jù)
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語(yǔ)句中,如果數(shù)據(jù)庫(kù)是Access數(shù)據(jù)庫(kù),則日期用#55-03-04#括起來(lái),如本例;如果是SQL Server數(shù)據(jù)庫(kù),則日期要用'55-03-04'括起來(lái)。
2. rsTest.Open StrSQL, Cnn,,,adCmdText中,由于第一個(gè)參數(shù)是SQL語(yǔ)句,所以第五個(gè)參數(shù)為adCmdText,其實(shí),第五個(gè)參數(shù)完全可以省略,但是加上它會(huì)使腳本的執(zhí)行效率更高。
3. 使用方法一,一次可以更新符合條件的所有記錄(多條記錄或一條記錄),但方法二中的Update只能修改當(dāng)前記錄(符合條件的第一條記錄)。

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

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

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

四、 其它一些有用的知識(shí)
1. 成批更新數(shù)據(jù)
上面我們講了如何使用Recordset對(duì)象的Update方法更新數(shù)據(jù),事實(shí)上,Recordset 對(duì)象可支持兩類更新:立即更新和批更新。 
使用立即更新,一旦調(diào)用 Update 方法,對(duì)數(shù)據(jù)的所有更改將被立即寫(xiě)入現(xiàn)行數(shù)據(jù)源。
使用批更新,可以使提供者將多個(gè)記錄的更改存入緩存,然后使用 UpdateBatch 方法在單個(gè)調(diào)用中將它們傳送給數(shù)據(jù)庫(kù)。更新多個(gè)記錄時(shí),批更新比立即更新更有效。
缺省為立即更新模式。使用批更新模式,要使用客戶端游標(biāo),例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 '使用客戶端游標(biāo)類型
rsTest.LockType = adLockBatchOptimistic
StrSQL = "SELECT * FROM 運(yùn)貨商 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

'第四部分: 打掃戰(zhàn)場(chǎng)
Cnn.close
Set rsTest = Nothing: Set Cnn = Nothing
%>
</BODY>
</HTML>
注意:
1) rsTest.CursorLocation = adUseClient有兩個(gè)值,另一個(gè)值為adUseServer(默認(rèn)),對(duì)初學(xué)者而言,Recordset對(duì)象的游標(biāo)類型是比較難的部分,這里不再詳細(xì)介紹,以免越來(lái)越糊涂,請(qǐng)?jiān)趯?shí)際處理中慢慢摸索(多試)。
2) rsTest.Requery:使用 Requery 方法刷新數(shù)據(jù)源的 Recordset 對(duì)象的全部?jī)?nèi)容。調(diào)用該方法等于相繼調(diào)用 Close 和 Open 方法。

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

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

'第四部分: 打掃戰(zhàn)場(chǎng)
Cnn.close
Set rsTest = Nothing: Set Cnn = Nothing
%>
</BODY>
</HTML>

3.除了上面介紹的兩種方法之外,還可使用SQL語(yǔ)句、Command對(duì)象的Excute方法維護(hù)數(shù)據(jù)庫(kù)。例wuf58.asp
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf58.asp
'第二部分: 使用SQL語(yǔ)句、Command對(duì)象的Excute方法維護(hù)數(shù)據(jù)庫(kù)
Dim StrSQL, rsTest, cmdChange
StrSQL = "INSERT INTO 運(yùn)貨商 (公司名稱,電話) VALUES('wu''feng','0571-7227298')"

' 創(chuàng)建命令對(duì)象。
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 "運(yùn)貨商", Cnn, , , adCmdTable
Do While Not rsTest.EOF 
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext 
Loop

'第四部分: 打掃戰(zhàn)場(chǎng)
Cnn.close
Set rsTest = Nothing: Set Cnn = Nothing
%>
</BODY>
</HTML>

本講主要介紹了維護(hù)數(shù)據(jù)的三種方法,初學(xué)者只要掌握前兩種方法就可以了。一般而言,盡量使用SQL語(yǔ)句解決問(wèn)題,簡(jiǎn)單明了;而使用Recordset對(duì)象的最大好處是可以利用其大量的屬性和豐富的游標(biāo)類型,有更多的選擇,但也給使用帶來(lái)一些難題,關(guān)鍵在于多摸索,多試驗(yàn)。



標(biāo)簽:ASP知識(shí)講座7