首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 操作系统-> FreeBSD教程
ASP讲座之七:ASP与数据库(二)-ASP教程,数据库相关
作者:网友供稿 点击:43
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
在上一讲中,我们学习了如何与数据库建立连接和从数据库中检索数据,今天的内容是如何向数据库中添加新数据、修改和删除数据库中的数据。

一、 向数据库中添加新数据
方法一:使用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(wufeng,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语句添加数据的格式如上例,注意需要添加wufeng,在语句中必须使用wufeng,因为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("公司名称") = "wufeng"
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 = "公司名称 = wufeng"
if rstest.eof then       ‘若无此记录,则新增
rstest.addnew
rstest("公司名称") = "wufeng"
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(wufeng,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.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·Tomcat 5.5 配置 MySQL 数据库连接池-JSP教程,数据库相关
·Remoting编程知识二-.NET教程,.NET Framework
·java 实现web 登陆-JSP教程,Java技巧及代码
·Visual C#中的多线程编程-.NET教程,C#语言
·如何在freebsd4.9平台上安装darwin streaming server 5.0
·从网页上读取源代码,并写入文件-.NET教程,面向对象编程
·小型局域网布线攻略
·在Jsp程序读取或向DB写入数据乱码解决办法-JSP教程,数据库相关
·C#下的webservcie 实现代码和 在vc和python下的调用实现-.NET教程,C#语言
·cable modem技术综述
最新文章
·网站赚钱的四个技巧_网赚技巧
·做一个职业的酋长-访echo_站长访谈
·绿野户外网负责人海光:带着困惑上路_站长访谈
·站长自习室访谈系列:晴空--漫漫八年网络路_站长访谈
·搜房网无线主管王峰:互联网生存四原则_站长访谈
·discuz!6.0新版本尝鲜—“电子商务”功能强大而完善,会员在论坛开店轻而易举_discuz!论坛
·互联网时代的个人站长更需要独立思考_站长心得
·如何让网民爱上你的网站?(2)_站长心得
·运营论坛赢在创意,氛围决定成功_站长心得
·五年以后个人网站像传呼机一样成为历史?_站长心得
相关主题
  • ASP讲座之十:自己动手编写组件-ASP教程,组件开发
  • ASP讲座之十一:结束语——给您一些建议-ASP教程,性能优化
  • ASP讲座之九:ASP与数据库(四)-ASP教程,数据库相关
  • ASP讲座之八:ASP与数据库(三)-ASP教程,数据库相关
  • ASP讲座之六:ASP与数据库(一)-ASP教程,数据库相关
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭