您的位置:首页精文荟萃软件资讯 → ASP知识讲座七

ASP知识讲座七

时间:2004/10/7 18:20:00来源:本站整理作者:蓝点我要评论(0)

 ASP与数据库(二)

在上一讲中,我们学习了如何与数据库建立连接和从数据库中检索数据,今天的内容是如何向数据库中添加新数据、修改和删除数据库中的数据。

一、 向数据库中添加新数据
方法一:使用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 %>

<% ' wuf50.asp
'第二部分: 使用 Connection 对象的 Execute 添加新数据
Dim StrSQL, rsTest
StrSQL = "INSERT INTO 运货商 (公司名称,电话) VALUES('wu''feng','0571-7227298')"
Cnn.Execute StrSQL
%>


<% '第三部分: 将得到的记录集显示到浏览器上
Set rsTest = Cnn.Execute("Select * From 运货商")
Do While Not rsTest.EOF 
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "
"
rsTest.MoveNext 
Loop

'第四部分: 打扫战场
Cnn.close
Set rsTest = Nothing: Set Cnn = Nothing
%>


请注意以下几点:
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 %>


<% ' 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
%>


<% '第三部分: 将得到的记录集显示到浏览器上
'将数据库指针移到表中的第一条记录
If Not rsTest.EOF <> 0 Then
Response.Write "表中现有 [" & rsTest.RecordCount & "] 条数据" & "

"
rsTest.MoveFirst
End If

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

'第四部分: 打扫战场
Cnn.close
Set rsTest = Nothing: Set Cnn = Nothing
%>
 

分析:
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 %>


<% ' 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
%>


<% '第三部分: 将得到的记录集显示到浏览器上
rsTest.Requery
Do While Not rsTest.EOF 
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "
"
rsTest.MoveNext 
Loop

'第四部分: 打扫战场
Cnn.close
Set rsTest = Nothing: Set Cnn = Nothing
%>


注意:
1) rsTest.CursorLocation = adUseClient有两个值,另一个值为adUseServer(默认),对初学者而言,Recordset对象的游标类型是比较难的部分,这里不再详细介绍,以免越来越糊涂,请在实际处理中慢慢摸索(多试)。
2) rsTest.Requery:使用 Requery 方法刷新数据源的 Recordset 对象的全部内容。调用该方法等于相继调用 Close 和 Open 方法。

2.学会使用Recordset对象的Filter 属性
<% @LANGUAGE = VBScript %>


<% ' 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
%>


<% '第三部分: 将得到的记录集显示到浏览器上
'请仔细比较下面这一句要与不要的区别
'rsTest.Filter="" '用来清除 Filter 属性
rsTest.MoveFirst
Do While Not rsTest.EOF 
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "
"
rsTest.MoveNext 
Loop

'第四部分: 打扫战场
Cnn.close
Set rsTest = Nothing: Set Cnn = Nothing
%>



3.除了上面介绍的两种方法之外,还可使用SQL语句、Command对象的Excute方法维护数据库。例wuf58.asp
<% @LANGUAGE = VBScript %>


<% ' 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 
%>


<% '第三部分: 将得到的记录集显示到浏览器上
Set rsTest = server.CreateObject("ADODB.Recordset")
rsTest.Open "运货商", Cnn, , , adCmdTable
Do While Not rsTest.EOF 
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "
"
rsTest.MoveNext 
Loop

'第四部分: 打扫战场
Cnn.close
Set rsTest = Nothing: Set Cnn = Nothing
%>



本讲主要介绍了维护数据的三种方法,初学者只要掌握前两种方法就可以了。一般而言,尽量使用SQL语句解决问题,简单明了;而使用Recordset对象的最大好处是可以利用其大量的属性和丰富的游标类型,有更多的选择,但也给使用带来一些难题,关键在于多摸索,多试验。

相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3

最新文章 微信3.6.0测试版更新了微信支付漏洞会造成哪 360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗

人气排行 xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本