|
第14章ASP/SQLServer开发与编程14.1ASP技术概述第14章ASP/SQLServer开发与编程1 4.1ASP技术概述14.1ASP技术概述14.2ASP的内建对象14.2ASP的内建对象14.2 ASP的内建对象14.2ASP的内建对象14.2ASP的内建对象14.3.1ADO数据库接口简介14 .3.1ADO数据库接口简介14.3.1ADO数据库接口简介14.3.2ASP访问数据库简介14.3.3在A SP中使用ADO对象14.3.3在ASP中使用ADO对象14.3.3在ASP中使用ADO对象14.3.3在AS P中使用ADO对象14.3.3在ASP中使用ADO对象14.3.3在ASP中使用ADO对象14.3.3在ASP中 使用ADO对象14.3.3在ASP中使用ADO对象14.3.3在ASP中使用ADO对象14.3.3在ASP中使用 ADO对象14.3.3在ASP中使用ADO对象14.3.3在ASP中使用ADO对象14.3.3在ASP中使用AD O对象14.3.3在ASP中使用ADO对象14.3.3在ASP中使用ADO对象14.3.3在ASP中使用ADO对 象14.3.3在ASP中使用ADO对象14.3.3在ASP中使用ADO对象14.3.3在ASP中使用ADO对象 14.3.3在ASP中使用ADO对象14.3.3在ASP中使用ADO对象14.3.3在ASP中使用ADO对象14 .3.3在ASP中使用ADO对象14.3.3在ASP中使用ADO对象14.3.3在ASP中使用ADO对象14.4 通过ODBC访问数据库14.4通过ODBC访问数据库【例14.3】建立与数据库XSCJ的连接,执行该数据库 的存储过程disp_comp,该存储过程查询XS表中专业名为“计算机”的学生信息,其定义如图14.10所示,并确保连接用户有权执行 该存储过程,如图14.11所示。先建立与数据库的连接,然后通过Command对象使服务器执行XSCJ数据库的存储过程disp _comp,得到结果集,最后以HTML表格的形式输出结果集中的各行记录,运行结果如图14.12所示。【例14.4】通过表单 接收用户输入的学生学号和专业名,在XS表中查询该学生的姓名、出生时间和总学分并输出。设已在XSCJ数据库上创建了一个有 两个输入参数,名为Query_spec的存储过程,该存储过程的定义如下:CREATEPROCEDUREQuery_mark ( @numint, @specchar(20))ASSELECT姓名,出生时间,总学分FROMXSW HERE学号=@numand专业名=@specGO从本例可看出,执行带参数的存储过程的方法是:(1)创建Co mmmand对象和各参数对象;(2)分别设置Command对象的ActiveConnection、CommandType和Co mmandText对象或属性值;(3)设置各参数对象的属性值;(4)用Command对象的Append方法将各参数对象加入 到其参数表中;(5)为Command对象的Value属性赋值;(6)用Command对象的Execute方法执行存储过程。 本例的运行结果分别如图14.13和图14.14所示。本例使用了另一个ADO对象—Parameter对象,一个Parameter对 象对应一个过程或函数的参数,其主要属性列于表14.12中。参数的值Value参数的数据类型Type参数的最大长度Siz e参数名Name输入,输出或输入/输出Direction描述属性名ADO中参数数据类型的标识符及值的定义列于表14. 13中。adVarBinary(204)图片或对象adDBTimeStamp(135)日期时间adDate(7)日期 adBoolean(11)布尔adCurrency(6)货币adDouble(5)双精度adSingle(4)单精度 数adInteger(3)长整数adSmallInt(2)整数adUnsignedTinyInt(17)字节adLo ngVarChar(201)备注adChar(129)字符adVarChar(200)变长字符标识符及值数据类型若 采用这种方式指定参数,程序代码为:Setcmd=Server.CreateObject("ADODB.Command") ''创建Command对象Setcmd.ActiveConnection=cn设置Command 对象使用的连接cmd.CommandType=adCmdStoredProccmd.CommandText="Quer y_spec"指定Command对象执行的存储过程''创建Parameter对象并加入Command对象的Parame ters集合cmd.Parameters.Appendcmd.CreateParameter("@num",adInteger ,adParamInput)cmd.Parameters.Appendcmd.CreateParameter("@spec", adVarChar,,20,adParamInput)''为参数对象指定值cmd("@num")=numbercmd(" @spec")=speciality''此后即可执行存储过程Setrs=cmd.Execute ''执行存储过程 ,得到结果集第二种方式是通过一个数组将存储过程执行时需要的参数由Command对象的Execute方法进行传递。如前例若采用这种 方式,程序代码为:Setcmd=Server.CreateObject("ADODB.Command")''创建Comm and对象Setcmd.ActiveConnection=cn ''设置Command对象使用的连 接cmd.CommandType=adCmdStoredProccmd.CommandText=“Query_spec ” ‘指定Command对象执行的存储过程''定义存放参数值的数 组,并赋值Dimparam(1)param(0)=CInt(number)param(1)=CStr(specia lity)''将参数数组通过Execute方法传递Setrs=cmd.Execute(,param) ''执行存储过程,得到结果集基于Web的计算技术采用B/C/S(Browser/Client/Server)三层 体系结构,如图14.1所示。有代表性的技术是:CGI(CommonGatewayInterface,公共网关接口)、Web ServerAPI(如NSAPI、ISAPI)、JDBC及ASP(ActiveServerPages,活动服务器页面),本 章主要介绍使用ASP技术操作SQL数据库。1.ASP概述ASP是微软公司随其IIS3.0推出的一种主要用于Web服 务器访问数据库的技术,它提供使用VBScript或Jscript(Microsoft的JavaScript实现)的服务器端脚本环境 ,可用来创建和运行动态、交互的Web服务器应用程序。2.IIS/Web服务器的配置要调试ASP脚本程序,双击该文件 图标或在浏览器中打开文件都是不行的,通过Web服务器端的处理才能在浏览器中浏览到结果页面。在Windows2000 Server/IIS中创建Web站点的方法如下:首先启动Internet服务管理器:开始?管理工具?Internet 服务管理器,Internet服务管理器界面如图14.2所示。在“管理Web站点”上单击鼠标右键,选择“新建”?“站点”,依 次输入站点名、选择站点IP地址及端口号、指定站点主目录路径以及用户对站点的访问权限,站点即创建完成。此时,在Internet服务管 理器中可见新建的站点(例如test1)及其内容,如图14.3所示。3.ASP使用的脚本语言ASP中可嵌入的脚本语言可以是VB Script和JScript,此外,还可通过plug-in方式,使用由第三方提供的脚本语言,如Perl、Tel等。AS P对象是特别为Web页面设计提供的,这些对象可以搜集及存储随浏览器发送的信息、响应浏览器等。ASP内建对象列于表14.1中。 捕捉ASP错误,返回错误描述ASPError提交或终止由ASP脚本启动的事务ObjectContext发送用户的信息Re sponse获取浏览器信息Request记录来访用户的信息Session记录不同网页的共享信息Application 提供服务器的信息Server描述对象名1.Response对象使用Response对象可以控制发送给用户的信 息,包括直接发送信息到浏览器、重定向到其他URL或设置Cookie值。Response对象共有5个属性和8个方法,在程序设计中,通 常使用Response的Write方法向浏览器传送响应。将指定的内容写入页面文件方法Write通知浏览器连接到指定的UR L方法Redirect停止处理页面并返回当前结果方法End清除缓冲的HTML输出方法Clear添加或更新HTML 头部的内容方法AppendHeader返回的HTTP服务器状态属性Status指示缓冲页面是否完成属性Buffer 描述类别名称2.Request对象Request基本上是与Response相对应的对象,其作用是用于读取浏览器 的信息。Request对象又包含5个对象集合,这些对象集合的值是只读的,表14.3列出了这5个对象集合的名称和描述。HTTP环境 变量的值ServerVariableHTTP查询串中的变量值QueryString发送到浏览器或浏览器发来的表单值For m浏览器的权限验证值ClientCertificate发送到浏览器或来自浏览器的Cookies信息Cookies描述名 称3.Server对象Server是最基本的ASP对象,它有一个属性ScriptTimeout和4个方法,表14.4列出了 Server对象的属性和方法。URL编码串方法URLEncode转换虚拟路径为物理路径方法MapPathHTML编码 串方法HTMLEncode创建对象或服务器组件的实例方法CreateObject脚本终止前服务器允许脚本运行的时间片长 度,缺省值为90秒属性ScriptTimeout描述类别名称4.Application对象方法是:Applic ation(“变量名”)=变量名或SetApplication(“对象名”)=对象名当下次执行该ASP文件时,用下 面的语句就可以恢复出变量或对象的值:变量名=Application(“变量名”)或Set对象名=Applicatio n(“对象名”)必须锁定Count:Application.LockApplication(“Count”)=Applica tion(“Count”)+1Application.UnLockApplication对象还提供了两个事件驱动接口,是OnS tart和OnEnd事件。5.Session对象Session对象与Application对象一样也是各ASP文件共享的 对象,但两者的区别是,各个用户共享一个Application对象,而每个用户却可以拥有自己的Session对象,Session对象 只在不同页面之间共享信息。1.ADO访问SQLServer的编程接口ADO是一种功能强大的数据库应用程序接口,通过ADO访 问SQLServer数据库的编程接口如图14.4所示。2.ADO编程模型ADO编程模型由Connection、Comman d、Recordset三种对象构成。(1)Connection对象用于建立与数据源的连接,通过连接可从应用程序访问数据源; (2)Command对象在建立Connection对象后,通过Command对象可对数据源中的数据进行各种操作,如查询、添加、 删除、修改等。(3)Recordset对象代表某一连接表的记录集或Command对象的操作结果。ADO是采用层次框架实现的 ,其层次结构如图14.5所示。使用ASP技术访问数据库的处理过程如图14.6所示。在ASP中引用ADO对象,要加上前缀“ADO DB”。例如,下面的语句将创建一个Recordset对象:<%Setrs=Server.CreateObject (“ADODB.Recordset”)%>几个常用的ADO对象列于表14.5中。数据源返回的记录集Recordset命令 参数Parameter一个Recordset对象的列Field数据源返回的错误信息Error可被数据源执行的命令Co mmand到数据源的连接Connection描述对象名1.Connection对象<%''创 建一个ADOConnection对象Setcn=Server.CreateObject("ADODB.Connectio n")''指定OLEDB提供者cn.Provider="sqloledb"''赋予OLEDB连接串ProvStr ="Server=USER1;Database=XSCJ;UID=lo;PWD=l123;"cn.OpenProvStr Response.Write(" "&cn.Attributes)Response.Write (" "&cn.CommandTimeout)Response.Write(" "&cn.Con nectionString)Response.Write(" "&cn.CursorLocation) Response.Write(" "&cn.DefaultDatabase)Response.W rite(" "&cn.IsolationLevel)Response.Write(" "&cn .Provider)Response.Write(" "&cn.Version)%> html>本例在连接成功建立后,用ASP对象Response向浏览器返回该连接的属性,该程序的运行结果如图14.7所示。结束当 前处理并取消对数据源的修改RollBackTrans结束当前处理并保存对数据源的修改CommitTrans使数据源开始一个 新处理BeginTrans在数据源上执行一个命令,返回一个结果集Execute关闭数据源的连接Close打开一个数据源 的连接Open描述方法名Connection对象有6个方法和9个属性,列于表14.6和14.7中。ADO版本号RVe rsion为连接提供数据的提供者名R/WProvider当未指定数据库名时所连接到的数据库R/WDefaultData base等待连接数据源的时间(缺省值为15秒)R/WConnectionTimeout若未传递参数给Open方法,则在Co nnectionString中置入数据源连接串可达到同样的目的R/WConnectionString等待命令执行的时间(缺省 值为30秒)R/WCommandTimeout描述访问属性属性名2.Recordset对象Recordset对象是 对结果集的封装,其数据结构可认为与表相同,Recordset(若不为空)中的数据在逻辑上由行和列组成。Recordset对象有比较 多的属性和方法,将它们分别列于表14.8和14.9中。Recordset中的记录数RRecordCount一个页面所包含的 记录数R/WPageSize指定结果集的最多记录数,缺省值为0,表示不限制大小R/WMaxRecordsRecords et所包含的页数RPageCount若当前位置在Recordset的尾部,其值为真,否则为假REOF若当前位置在Rec ordset的首部,其值为真,否则为假RBOF当前Connection对象R/WActiveConnection结果集 的当前记录号R/WAbsolutPosition结果集的当前记录位置所在的页号R/WAbsolutPage描述访问属 性属性名Recordset对象的常用方法成批修改记录UpdateBatch修改当前记录Update判别Records et是否支持当前的方法或属性Support再执行一次查询Requery打开与数据源连接的新的Recordset对象Ope n将当前位置移动到前一条记录MovePrevious将当前位置移动到下一条记录MoveNext将当前位置移动到最后一条记 录MoveLast将当前位置移动到第一条记录MoveFirst将当前位置移动到指定记录Move从Recordset及记 录在数组中的位置得到记录号GetRows删除当前记录Delete关闭与Recordset的连接Close创建一个当前R ecordset的拷贝Clone在执行Update方法之前取消对记录的修改CancelUpdate向Recordset中添 加新记录Addnew描述方法名本例的运行结果如图14.8所示。创建Recordset对象还有另一种方法:Setrs =Server.CreateObject(“ADODB.Recordset”)rs.OpenT-SQL语句,Connecti on对象,Recordset类型,锁定类型如上例中,我们可以把语句Setrs=cn.Execute("selectf romXS")替换为:Setrs=Server.CreateObject("ADODB.Recordset")rs.O pen"SelectfromXS",cn,adOpenStatic这种方法还有另一种写法:Setrs=Serv er.CreateObject("ADODB.Recordset")rs.ActiveConnection=cnr s.Open"SelectfromXS",,adOpenStatic‘此时可省略连接参数Recordset对象 的Open方法有4个参数:SQL语句,是形成结果集的语句。若结果集由表中所有记录构成,则可直接使用表名,这个规则也适用于Exec ute方法。例如Setrs=cn.Execute("selectfromXS")等价于Setrs=cn.E xecute(“XS”)。(2)Connection对象:到所访问数据源的连接。(3)Recordset类型:指结果集的 读写属性,有四种值:AdOpenForward—只读,只向前,数值为0;AdOpenStatic— 只读,当前记录指针可前后移动,数值为3;AdOpenKeyset—读写,当前记录指针可前后移动,数值为1; AdOpenDynamic—读写,当前记录指针可前后移动,数值为2。AdOpenKeyset与AdOpenD ynamic的区别在于,使用AdOpenKeyset将无法查看到其他用户对数据的更改,而使用AdOpenDynamic可查看到其他 用户对数据的更改。(4)锁定类型:指出对结果集中的数据采用的锁定类型,有以下四种值:adLockReadOnly —只读锁,为默认值,数值为1;adLockPessimistic—悲观锁定,数值为2;adLock Optimistic—乐观锁定,数值为3;adLockBatchOptimistic—乐观批锁定,数值为4。 引用字段数据的方法方法一rs.Fields(i).Value这种格式在前面的例子中已经用过,表示引用第i个字段的数据。 可简化为rs(i)。方法二rs.Fields(字段名).Value例如:rs.Fields(“学号”).Value,rs.F ields(“姓名”).Value这种格式可读性比第一种要好。这种格式还有两种简化形式:①rs.Fields(“字段名”),如 rs.Fields(“学号”)。②rs(“字段名”),如rs(“姓名”)。数据增加例如向XS数据库增加一条记录:rs .AddNew‘假设已经创建了记录集rs,用AddNew要求增加一条记录rs(“学号”)=“1011 16”‘逐字段设置值rs(“姓名”)=“王小明”rs(“专业名”)=“计算机”rs(“性别”)=true rs(“出生时间”)=1978-1-31rs(“总学分”)=40rs.Update‘写入数 据库数据修改修改结果集中数据,首先要用MoveNext等移动记录指针的方法将当前记录指针移动到要修改的记录位置,然后直接设 置字段的新值,最后调用Update方法将修改了的数据写入数据库。例如,下列语句将当前记录的总学分改为50:rs(“总学分”)= 50rs.Update数据修改与数据增加操作都可以用CancelUpdate方法取消。数据删除使用Recordset 对象的Delete方法可将结果集中的当前记录删除。如:rs.Delete将删除rs中的当前记录。数据分页显示当结果集中 的记录数比较多时,采用分页显示的方式可使结果显示结构清晰,并能使用户有选择地查看信息。【例14.2】建立与数据库XSCJ的连接, 返回XS表的所有记录,在浏览器中以表格形式进行分页显示。文件page.asp<%Setcn=Ser ver.CreateObject("ADODB.Connection")cn.Provider="sqloledb"Pro vStr="Server=USER1;Database=XSCJ;UID=lo;PWD=l123;"cn.OpenProv StrSetrs=Server.CreateObject("ADODB.Recordset")rs.Open"Sele ctfromXS",cn,adOpenStatic%>分页浏览数据库le>学生信息表 <%rs.P ageSize=8 ''设置rs的页的大小为8条记录Page=CLng(Request("PageText") )IFPage<1THENPage=1IFPage>rs.PageCountTHENPage=rs .PageCountShowPagers,Page%>
ormaction="page.asp"method="get"><%IFPage<>1THENRe sponse.Write"第一页"Respons e.Write"上一页"EN DIFIFPage<>rs.PageCountTHEN Response.Write"ge.asp?PageText="&(Page+1)&">下一页" Response.Write"< ahref=page.asp?PageText="&rs.PageCount&">最后一页"ENDIF% >输入页号:总页数:olor="red"><%=Page%>/<%=rs.PageCount%> < /body>文件ShowPage.asp<%SubShowPage(rs,Page) ''显示结 果集中的一页Response.Write""Response .Write""FORi=0TOrs.Fields.Count-1 Response.Write""&rs.Fields(i).Name&" | "NE XTResponse.Write" | "rs.AbsolutePage=PageFOR i=1TOrs.PageSizeResponse.Write""FORj= 0toTO.Fields.Count-1Response.Write""&rs.Fie lds(j).Value&" | "NEXTResponse.Write" "rs.MoveNextIFrs.EOFTHENExitFOR''若已到末尾则结束循 环NEXTResponse.Write" "EndSub%>该程 序的执行结果如图14.9所示。结合Session对象<%Session.Timeout=60 '' 设置Session对象的存在时间,单位是分钟IFNOTIsObject(Session("XSCJ_cn"))THEN'' 判断连接是否已经存在,若不存在,则建立连接Setcn=Server.CreateObject("ADODB.Conn ection")cn.Provider="sqloledb"ProvStr="Server=USER1;D atabase=XSCJ;UID=lo;PWD=l123;"cn.OpenProvStrSetSession( "XSCJ_cn")=cn ''将cn对象保存在Session对象中ELSE ''连接已经存在,只需从Session对象中恢复出来Setcn=Session("XSCJ_cn")END IFIFNOTIsObject(Session("XSCJ_rs"))THENSetrs=Server.CreateObject("ADODB.Recordset")rs.Open"SelectfromXS",cn,adOpenStaticSetSession("XSCJ_rs")=rsELSESetrs=Session("XSCJ_rs")ENDIF%>3.Command对象命令类型的设置值可以是:adCmdText(值为1),其中命令是一个查询或数据定义语句;adCmdTable(值为2),其中命令是一个表名;adCmdStoredProc(值为4),其中命令是一个服务器端存储过程的引用;adCmdUnknow(值为8),其中命令是一个未知命令。例如,下面的程序代码可使服务器执行SQL语句:Setcmd=Server.CreateObject(“ADODB.Command”)Setcmd.ActiveConnection=cn;sql=“selectfromXSwhere总学分>40”cmd.CommandText=sqlSetrs=cmd.Execute利用Command对象使服务器执行SQL语句时,先要创建Command对象,然后设置Command对象的ActiveConnection和CommandText属性值,最后才引用Execute方法使服务器执行设定的SQL语句。指示在执行命令前是否创建准备语句R/WPrepared命令的类型R/WCommanType等待命令执行的时间,缺省值为30秒R/WCommanTimeout命令串R/WCommanText当前Connection对象R/WActiveConnection描述访问属性属性名?执行指定的命令或存储过程Excute创建一个新的Parameter对象CreateParameter描述方法名 |
|