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

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 软件教学-> 压缩工具
ASP讲座之九:ASP与数据库(四)-ASP教程,数据库相关
作者:网友供稿 点击:27
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
在本讲中,我们将主要介绍如何使用参数及存储过程

一、 使用command对象和parameter对象传递参数
本讲将主要使用microsoft sql server7.0数据库,先建立一个连接文件adosql7.asp备用,以后用到时不再特别说明。
<% adosql7.asp
option explicit
response.expires = 0

第一部分: 建立连接
dim cnn, strcnn
set cnn = server.createobject("adodb.connection")
strcnn = "provider=sqloledb; user id=sa; password=; initial catalog=pubs; data source=icbczjp"
cnn.open strcnn
%>
注意:自己使用时要将data source设为你的数据库服务器所在的机器名。
另外,以前使用access数据库时,用microsoft access97可以很方便的查看字段及数据,而使用sql server数据库,尤其是并不在数据库服务器,而是在另一台机器上调试asp脚本时,要查看字段及数据便需另外安装工具,这里向你提供一个工具:msqry32.exe(microsoft query),这个文件随office97安装,一般位于目录“microsoft office\office”下。
例wuf70.asp:
<%@ language="vbscript" %>
<!--#include file="adosql7.asp"-->
<!--#include file="adovbs.inc"-->
<% wuf70.asp
dim cmdtest, prmtest, rstest
创建 command 对象
set cmdtest = server.createobject("adodb.command")
‘recordset、command对象都可以通过activeconnection属性来连接connection对象
cmdtest.activeconnection = cnn
sql命令 - 含两个参数, 用 ? 表示
cmdtest.commandtext = "update jobs set job_desc = ? where job_id = ?"
设命令类型为 sql 语句
cmdtest.commandtype = adcmdtext
prepared 属性决定是否将 sql 命令先行编译,将其设为true,可以加快运行
cmdtest.prepared = true

创建 parameter 对象
set prmtest=cmdtest.createparameter("job_desc",advarchar,adparaminput,50,"网络")
将数据追加到 parameters 数据集合中
cmdtest.parameters.append prmtest

set prmtest = cmdtest.createparameter("job_id",adsmallint,adparaminput,,"12")
cmdtest.parameters.append prmtest

执行修改 – 不需要返回结果,简单的使用cmdtest.execute 就可以了
cmdtest.execute

重新设置参数运行 – 便可修改另一条数据
cmdtest.parameters("job_id") = "1"
cmdtest.parameters("job_desc") = "测试"
cmdtest.execute

重新设置参数运行
cmdtest("job_id") = "14"
cmdtest("job_desc") = "金融"
cmdtest.execute

set rstest = cnn.execute("select job_id,job_desc from jobs")
while not rstest.eof
response.write rstest(0) & rstest(1) & "<br>"
rstest.movenext
wend

cnn.close : set prmtest = nothing
set cmdtest = nothing: set cnn = nothing
%>
分析:
1. command对象的createparameter方法用来为sql命令或存储过程建立参数对象,共有五个参数(五个参数都是可选项):
第一个参数:参数对象的名称;
第二个参数:参数对象的数据类型,种类太多,还是参考ado帮助吧,这里advarchar(字符串值)、adsmallint(2 字节带符号整型);
第三个参数:参数类型。可以是:adparaminput(指示输入参数)、adparamoutput( 指示为输出参数)、adparamreturnvalue(指示为返回值)、adparamunknown(指示参数类型无法确定)、adparaminputoutput(指示为输入/输出参数);
第四个参数:参数的数据长度,最好指定为与数据库中对应字段长度相等,以免使用时出错,尤其数据类型为varchar时,如果是整型或日期型则不必提供该值;
第五个参数:参数的设置初值。
2. cmdtest.parameters.append方法增加一个parameter对象到parameters数据集合中,从本例中也可看到如何使用多个参数。
3. 从本例可以看到,只需要重新设定输入参数,便可执行对其他数据的修改,非常方便,这一思路在编程时也是最常用的方法之一。
4. 重设参数,既可以使用cmdtest.parameters,也可以省略为cmdtest("job_id")。

二、 在asp中使用存储过程
什么是存储过程存储过程位于数据库服务器中,是一个sql语句的集合,可包含一个或多个sql语句)、怎样创建存储过程不属于本讲座的内容,本讲座主要是举例说明在asp中如何调用存储过程
使用存储过程的好处是大大的,存储过程比在asp脚本中运行sql命令效率更高;可以提高整体性能并减轻网络负载(减少了在网络服务器和数据服务器之间的交互);可以优化asp代码和增强代码灵活性等等。
(一) 在存储过程中使用输入参数
本例中使用的存储过程为sql server7.0自带的“byroyalty”,里面的一条sql语句非常简单,无非是多了一个create procedure byroyalty,并且有一个输入参数为@percentage:
create procedure byroyalty @percentage int
as
select au_id from titleauthor
where titleauthor.royaltyper = @percentage
例wuf71.asp
<% @language = vbscript %>
<!--#include file="adosql7.asp"-->
<!--#include file="adovbs.inc"-->
<% wuf71.asp
dim cmdtest, prmtest, rstest
set cmdtest = server.createobject("adodb.command")
cmdtest.commandtext = "byroyalty"          存储过程
设命令类型为 存储过程
cmdtest.commandtype = adcmdstoredproc

创建 parameter 对象
set prmtest = server.createobject("adodb.parameter")
‘type属性对应wuf70.asp中的第二个参数
prmtest.type = adinteger        4 字节的带符号整型
‘direction属性对应wuf70.asp中的第三个参数
prmtest.direction = adparaminput
‘value属性对应wuf70.asp中的第五个参数
prmtest.value = 30
cmdtest.parameters.append prmtest

set cmdtest.activeconnection = cnn
‘需要返回一个记录集,故使用set rstest = cmdtest.execute
set rstest = cmdtest.execute

while not rstest.eof
response.write rstest(0)  & "<br>"
rstest.movenext
wend

cnn.close
set rstest = nothing : set prmtest = nothing
set cmdtest = nothing: set cnn = nothing
%>
    commandtext属性既可以指定sql命令,也可以指定为存储过程或者是表名称。
    在本例中,创建parameter对象与wuf70.asp略有不同,其实仔细看看,意思也是差不多的,本例还有两个属性未用:prmtest.name、prmtest.size,加上type、direction和value,对应于wuf70.asp中的五个参数。

(二) 使用输出参数
数据库表中取得一个记录或计算一个值时,需要使用返回输出参数的存储过程。为了举例,先在sql server的pubs库中新建一存储过程outemploy,该存储过程需要输入两个日期,然后输出一个最大值。
create procedure outemploy
(
@job_lvl tinyint output,
@hire_date1 datetime,
@hire_date2 datetime
)
as
select @job_lvl = max(job_lvl) from employee
where hire_date >= @hire_date1 and hire_date <= @hire_date2
有多种方法可以建立存储过程
1. 使用microsoft sql server的enterprise manager,打开后在左边的树目录中依次打开:console root – microsoft sql servers – sql server group – icbczjp(windows nt) – databases – pubs – stored procedure – new stored procedure,输入存储过程后,还可对其进行语法检测;
2. 使用microsoft sql server的query analyzer,先连接数据库服务器并选择pubs数据库。输入上面的存储过程并点击execute query(或按f5);
3. 使用vb6.0,打开菜单“视图”/“数据视图窗口”后,右键单击“数据链接”/“新建数据链接”;
4. 使用asp脚本创建存储过程,例wuf75.asp:
<% @language = vbscript %>
<!--#include file="adosql7.asp"-->
<!--#include file="adovbs.inc"-->
<% wuf75.asp
dim strsql
注: & chr(10) & chr(13) 完全可以不要, 主要是为了好看
strsql="create procedure outemploy ( @job_lvl tinyint output, " & chr(10) & chr(13) &_
       "@hire_date1 datetime, @hire_date2 datetime) as " & chr(10) & chr(13) &_
       "select @job_lvl = max(job_lvl) from employee " &_
       "where hire_date >= @hire_date1 and hire_date <= @hire_date2"

cnn.execute strsql
response.write "创建存储过程成功"
cnn.close: set cnn = nothing
%>
    存储过程创建后,除了使用菜单,你还可以使用sql语句“drop procedure outemploy”删除它。
    例wuf72.asp – 把所需要的输入参数送入存储过程并取得输出结果。
<% @language = vbscript %>
<!--#include file="adosql7.asp"-->
<!--#include file="adovbs.inc"-->
<% wuf72.asp
dim cmdtest, prmtest
set cmdtest = server.createobject("adodb.command")
cmdtest.activeconnection = cnn
cmdtest.commandtext = "outemploy"    存储过程
cmdtest.commandtype = adcmdstoredproc

创建 parameter 对象
set prmtest = cmdtest.createparameter("job_lvl",adtinyint,adparamoutput)
cmdtest.parameters.append prmtest
adtinyint - 1 字节带符号整型
addbdate - 日期值 (yyyymmdd)

set prmtest = cmdtest.createparameter("hiredate1",addbdate,adparaminput,,"1993-05-09")
cmdtest.parameters.append prmtest

set prmtest = cmdtest.createparameter("hiredate2",addbdate,adparaminput,,"1994-02-01")
cmdtest.parameters.append prmtest

cmdtest.execute
‘下面三种表达方式意思一样
response.write cmdtest("job_lvl") & "<br>"
response.write cmdtest.parameters("job_lvl") & "<br>"
response.write cmdtest.parameters("job_lvl").value

cnn.close
set prmtest = nothing
set cmdtest = nothing: set cnn = nothing
%>
(三) 使用返回代码参数
用return语句可以从存储过程返回不同的返回代码,如下面存储过程先取得一个记录集,然后,若有叫margaret的雇员则返回1,否则返回0。
create procedure returnemploy
as
select emp_id, fname from employee
if exists(select fname from employee where fname=margaret)
return(1)
else
return(0)
例wuf73.asp
<% @language = vbscript %>
<!--#include file="adosql7.asp"-->
<!--#include file="adovbs.inc"-->
<% wuf73.asp
dim cmdtest, prmtest, rstest
set cmdtest = server.createobject("adodb.command")
cmdtest.activeconnection = cnn
cmdtest.commandtext = "returnemploy"    存储过程
cmdtest.commandtype = adcmdstoredproc

set prmtest = cmdtest.createparameter("returnvalue",adinteger,adparamreturnvalue)
cmdtest.parameters.append prmtest

set rstest = cmdtest.execute()
while not rstest.eof
response.write rstest(0) & " ][ " & rstest(1) & "<br>"
rstest.movenext
wend
rstest.close: set rstest = nothing
返回 cmdtest("returnvalue") 之前,必须先关闭rstest, 否则结果错误

if cmdtest("returnvalue") = 1 then
response.write "有该雇员"
else
response.write "无该雇员"
end if

cnn.close
set prmtest = nothing
set cmdtest = nothing: set cnn = nothing
%>

三、 如何处理大数据
这里的“大数据”主要是指text(大文本)和image(图像)字段,采用前面所述的方法无法正确获取其数据。必须首先使用size = rstest(0).actualsize获取字段值的实际长度,然后再使用rstest(0).getchunk(size)取得数据。在实际使用过程中,由于这些字段都比较大,为了节省、合理使用服务器资源,一般均采取分段读取的方法。例wuf74.asp:
<% @language = vbscript %>
<!--#include file="adosql7.asp"-->
<!--#include file="adovbs.inc"-->
<% wuf74.asp
dim strsql, rstest
‘pr_info 是一个文本字段
strsql = "select pr_info,pub_id from pub_info"
set rstest = cnn.execute(strsql)

dim basicsize, beginsize, ltext
do while not rstest.eof    
response.write rstest(1) & "<br>"
‘每次读取 1024字节
basicsize = 1024
beginsize = 0
while beginsize < rstest(0).actualsize
ltext = rstest(0).getchunk(basicsize)
beginsize = beginsize + basicsize
‘逐段输出到客户端
        response.write ltext
wend

response.write "<br><br>"
    rstest.movenext       
loop

cnn.close
set rstest = nothing: set cnn = nothing
%>
在本例中,每次最多读取1024字节,分多次读完。反之,如果将大数据写至数据库中,方法类似上面,不过不是使用getchunk方法,而是使用appendchunk方法:
rstest(0).appendchunk ltext

注意:最后介绍一个关于sql server数据库的小技巧,如果你遇到过这种情况:数据库的中文数据显示出来均是乱码,请不要惊慌。你只要去我的站点下载sqlsrv32.dll覆盖“c:\windows\system”下的同名文件就可以了。问题发生的源头是sql server驱动程序,典型的情况发生在windows98第二版(sql server驱动程序的版本号为3.70.06.23)或windows2000中或者安装了mdac2.5(版本号为3.70.08.20)。

文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·web打印的另类方法-ASP教程,打印相关
·Java简单类型进行精确浮点数运算-JSP教程,Java技巧及代码
·使用JAVAMAIL发邮件的一个例子-JSP教程,邮件相关
·中国移动本地传输网建设方案初探
·传输系统中的时钟同步技术
·JSP学习经验总结(转)-JSP教程,Jsp/Servlet
·WEB打印,去页眉和页脚-ASP教程,打印相关
·Native XML数据库技术详解-.NET教程,XML应用
·jsp生成html--readtemplates-JSP教程,Jsp/Servlet
·下拉框反回选定的文字 (修改页面经常用到)-ASP教程,ASP应用
最新文章
·在xp中如何使用windows vista屏保_windows xp
·photoshop调色:cmyk模式处理单色调特效_photoshop教程
·视频分享网站视频广告发展面临的问题_营销推广
·难以置信,这样的网站每月盈利上千万_营销推广
·大站做百度主题推广 小站做google adsense_网赚技巧
·方兴东:保留alexa插件才能给站长带来快乐_站长访谈
·网友天下ceo叶灵:欢迎大家看web2.0笑话_站长访谈
·我们应该如何运营网站_站长心得
·网站从业者还要更加务实才能赚钱_站长心得
·炼成高级网络编辑的三大原则_站长心得
相关主题
  • ASP讲座之十:自己动手编写组件-ASP教程,组件开发
  • ASP讲座之十一:结束语——给您一些建议-ASP教程,性能优化
  • ASP讲座之八:ASP与数据库(三)-ASP教程,数据库相关
  • ASP讲座之七:ASP与数据库(二)-ASP教程,数据库相关
  • ASP讲座之六:ASP与数据库(一)-ASP教程,数据库相关
  • 西部数码虚拟主机

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