选择显示字体大小

几例在asp存储过程的使用方法

一、使用command对象和parameter对象传递参数xml:namespace prefix = o />

本讲将主要使用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

serve by www.cidu.net

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.nameprmtest.size,加上typedirectionvalue,对应于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)。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons