一. 访问WEB数据库的多种方案 @nC][gNv
目前在WINDOWS环境下有多种访问WEB数据库的技术,主要有: PK C}!>2
1.公共网关接口CGI(Common Gateway Interface) rJjNoY
CGI是较早实现的技术。适用于多种服务器平台,如UNIX、WINDOWS等,但CGI的开发 mu#IF'|b
成本高、维护困难、功能有限、不具备事务处理功能、占用服务器资源较多。 |`T$Iq
2. INTERNET数据库连接器IDC(Internet Database Connector) =`MxgK +
IDC集成在ISAPI(Internet Server API)中,充分利用了DLL技术,易扩充,但编程 s3(mkdXv
较CGI更为复杂,只适用于小型数据库系统。 U0ZT9/4
3. 先进数据库连接器ADC(Advance Database Connector) Yfbo=yk
ADC提供了ActiveX Control来访问数据库,它的主要特点是数据查询由用户端浏览 y?6J%~\WP
器执行,因而需将服务器端数据库中的部分记录下载到用户端,系统开销较大、响应慢 fL^$G;_?3
,只适用于特别频繁的数据库查询操作。 !.2tv
4. JAVA/JDBC语言编程 0oNNEC
JAVA语言是一种面向对象、易移植、多线程控制的语言,可通过JDBC去连接数据库 L3/SIoqd
。用JAVA/JDBC编写的软件可移植性强,适用于多种操作系统,但其执行效率和执行速度 ^}w@&Bje
还不理想,目前无法建立高效、高速的应用。 v3p0
5. 动态服务器页面ASP(Active Server Page) *F<Ar\f5
ASP是微软公司最新推出的WEB应用开发技术,着重于处理动态网页和WEB数据库的开 (Q]Ww_r~
发,编程灵活、简洁,具有较高的性能,是目前访问WEB数据库的最佳选择。 'hoEdJ]t5
二. ASP简介 Abw=x4d(i
1.ASP访问数据库的原理 c
-sc*.&
ASP是服务器端的脚本执行环境,可用来产生和执行动态的高性能的WEB服务器程序 <?2g\+{s9
。 CXQ +h
当用户使用浏览器请求ASP主页时,WEB服务器响应,调用ASP引擎来执行ASP文件, p*NKM}
]I
并解释其中的脚本语言(JScript 或VBScript),通过ODBC连接数据库,由数据库访问组 D`Cy]j
件ADO(ActiveX Data Objects)完成数据库操作,最后ASP生成包含有数据查询结果的HT 1"\^@qRv#
ML主页返回用户端显示。 !:]/MpQ ?
由于ASP在服务器端运行,运行结果以HTML主页形式返回用户浏览器,因而ASP源程 {4F=].!
序不会泄密,增加了系统的安全保密性。此外,ASP是面向对象的脚本环境,用户可自行 QZh#&Qf;
增加ActiveX组件来扩充其功能,拓展应用范围。 e 2"<3
2.ASP页面的结构: N9dx^+\
ASP的程序代码简单、通用,文件名由.asp结尾,ASP文件通常由四部分构成: `{oFdvL~)
1) 标准的HTML标记:所有的HTML标记均可使用。 5cUz^ >
2) ASP语法命令:位于 标签内的ASP代码。 ;b`kN;s
3) 服务器端的include语句:可用#include语句调入其它ASP代码,增强了编程的灵 (DIMt-wz
活性。 nF5\iV
4) 脚本语言:ASP自带JScript和VBScript两种脚本语言,增加了ASP的编程功能, HZawB25{
用户也可安装其它脚本语言,如Perl、Rexx等。 Y5ZBP?P
3.ASP的运行环境 3wYhDxY1
目前ASP可运行在三种环境下。 g[c_rty
1) WINDOWS NT server 4.0运行IIS 3.0(Internet Information Server)以上。 |j2$G~B6
2) WINDOWS NT workstation 4.0运行Peer Web Server 3.0以上。 7DZZdH$Fm
3) WINDOWS 95/98运行PWS(Personal Web Server)。 YHp]O+c
其中以NT server上的IIS功能最强,提供了对ASP的全面支持,是创建高速、稳定的 XLgp.w;
ASP主页的最佳选择。 N,3 )`Vm
4.ASP的内建对象 DqJzsk'd3
ASP提供了六个内建对象,供用户直接调用: "C]v
1) Application对象:负责管理所有会话信息,可用来在指定的应用程序的所有用 qo*%S
户之间共享信息。 ;hV-*;>
2) Session对象:存贮特定用户的会话信息,只被该用户访问,当用户在不同WEB页 ,I2x&Ys&.
面跳转时,Session中的变量在用户整个会话过程中一直保存。Session对象需cookie支 "d; T1
持。 9Ai3p
3) Request对象:从用户端取得信息传递给服务器,是ASP读取用户输入的主要方法 CcJ%;.V,T
。 r`\6+ Ntb.
4) Response对象:服务器将输出内容发送到用户端。 d)WGI
RUx
5) Server对象:提供对服务器有关方法和属性的访问。 Ajm
6) Object Context对象:IIS 4.0新增的对象,用来进行事务处理。此项功能需得 oypF0?!m
到MTS(Microsoft Transcation Server)管理的支持。
N Zu2D
5. ASP的主要内置组件: Z~3
1) Ad Rotator组件:用来按指定计划在同一页上自动轮换显示广告,用于WWW上日 Q{o ]^tN
益重要的广告服务。 Z[G[.\0
2) Browser Capabilities组件:确定访问WEB站点的用户浏览器的功能数据,包括 =h>jo&=Wad
类型、性能、版本等。 9dO. ,U*`
3) Database Access组件:提供ADO (ActiveX Data Objects)来访问支持ODBC的数 7~qyz]KkE
据库。 Yq-Vwh/
4) File Access组件:提供对服务器端文件的读写功能。 {9XN\v=$"*
5) Content Linking组件:生成WEB页内容列表,并将各页顺序连接,用于制作导航 ?APCDZ^
条。 &SW~4 {n:
此外,还可安装Myinfo、Counters、Content Rotator、Page Count等组件,用户也 pwg\b
可自行编制Actiive组件,以提高系统的实用性。 ]<BT+6L
6. Database Access组件ADO ;S?ei>Q
WWW上很重要的应用是访问WEB数据库,用ASP访问WEB数据库时,必须使用ADO组件, gSk0#Jt
ADO是ASP内置的ActiveX服务器组件(ActiveX Server Component),通过在WEB服务器上 Tr.u'b(
设置ODBC和OLEDB可连接多种数据库:如SYBASE、ORACLE、INFORMIX、SQL SERVER、ACC XS(Q)\"
ESS、VFP等,是对目前微软所支持的数据库进行操作的最有效和最简单直接的方法。 ce<88dL
ADO组件主要提供了以下七个对象和四个集合来访问数据库。 c$8M}q:X
1) Connection对象:建立与后台数据库的连接。 B%I<6E[D
2) Command对象:执行SQL指令,访问数据库。 xyrlR;Sk
3) Parameters对象和Parameters集合:为Command对象提供数据和参数。 C <d]0)
4) RecordSet对象:存放访问数据库后的数据信息,是最经常使用的对象。 !y&<IT(\4
5) Field对象和Field集合:提供对RecordSet中当前记录的各个字段进行访问的功 j"
5 +"j
能。 ?&JKq^9\I
6) Property对象和Properties集合:提供有关信息,供Connection、Command、Re LlcH#L$
cordSet、Field对象使用。 AQGl}%k_
7) Error对象和Errors集合:提供访问数据库时的错误信息。 c=f;3N
三. ASP访问数据库步骤 ]64pb;w"$D
在ASP中,使用ADO组件访问后台数据库,可通过以下步骤进行: !8*7 {7
1. 定义数据源 b"y4-KV
在WEB服务器上打开“控制面板”,选中“ODBC”,在“系统DSN”下选“添加”, 8'Iei78Ov
选定你希望的数据库种类、名称、位置等。本文定义“SQL SERVER”,数据源为“HT” eWr2UXv$
,数据库名称为“HTDATA”,脚本语言采用Jscript。 pwVaSnre`
2,使用ADO组件查询WEB数据库 l^2m7 7)
1) 调用Server.CreateObject方法取得“ADODB.Connection”的实例,再使用Open ap<r)<u
方法打开数据库: g*;zVi
conn = Server.CreateObject(“ADODB.Connection”) v$Xoxp
conn.Open(“HT”) m>f8RBp]'
2) 指定要执行的SQL命令 OCu/w1bc
连接数据库后,可对数据库操作,如查询,修改,删除等,这些都是通过SQL指令来 #s{EIj~YR_
完成的,如要在数据表signaltab中查询代码中含有“X”的记录 0.&-1pw
sqlStr = “select * from signaltab where code like ‘%X%’” ZU;nXqjc
rs = conn.Execute(sqlStr) K?Jo"oy7
3) 使用RecordSet属性和方法,并显示结果 `(xzCRX
为了更精确地跟踪数据,要用RecordSet组件创建包含数据的游标,游标就是储存在 ]VaMulb4
内存中的数据。 Uka(Vr:
rs = Server.CreateObject(“ADODB.RecordSet”) qb$M.-\ne
rs.Open(sqlStr,conn,1,A) $U"pdf
注:A=1读取 W)AfXy
A=3 新增、修改、删除 :)F0~Q
在RecordSet组件中,常用的属性和方法有: '>GPk5Nq77
rs.Fields.Count: RecordSet对象的字段数。 Q[9W{l+
rs(i).Name: 第i个字段的名称,i为0至rs.Fields.Count-1 _~ 3r*j
rs(i): 第i个字段的数据,i为0至rs.Fields.Count-1 RBpv40n0
rs(字段名): 指定字段的数据。 zFr#j~L"
rs.Record.Count:游标中的数据记录总数。 v}. ~m)
rs.EOF: 是否最后一条记录。 Lb~'
I=9D
rs.MoveFirst: 指向第一条记录。 %GGSd0
g
rs.MoveLast: 指向最后一条记录。 ]]T,;|B
rs.MovePrev: 指向上一条记录。 _FCg5F2U
rs.MoveNext: 指向下一条记录。 ~En]sj
rs.GetRows: 将数据放入数组中。 ~ E n'X4
rs.Properties.Count:ADO的ResultSet或Connection的属性个数。 U2
Cmf
rs.Properties(item).Name:ADO的ResultSet或Connection的名称。 QTU$mC]
rs.Properties: ADO的ResultSet或Connection的值。 8{ )N%r
rs.close(): 关闭连接。 ;P^}2i[q>[
4) 关闭数据库 -YS9u[
conn.close() :464~tHI[`
四.查询WEB数据库举例 1]"S?
下面这段示例程序是访问SQL SERVER数据库的 signaltab表,表中有三个字段:co A#gy[.Bb
de(代码字段,字符型,3位),class(分类字段,字符型,10位),memo(备注字段,字符 eC@b-q
型,20位)。程序中数据源DSN:HT、用户名:client、口令:passwd。 xmejoOF
屏幕输入页面input.asp CUx-k|\
.ZupsS9l
Hq|{Nt%Q
}?*$AVs2q
请输入查询条件PLEASE INPUT CONDITION 'VV"$`Fu"
<CWOx&hr
tlgg~MViS
@2sr/gX^
71Y3.1+
_
Gkb[H&RZ
U.1&'U*
%>1C($^
4JL]?75
UYGO|lkEU
y24/lc
Ej<`HbJ'Q
.SDE6nvbW
数据库处理程序shotquery.asp MC1&X'
@DKph!cr
j2oU1' b
var signalCode=Request.Form(signalCode); p-h(C'PqF
dbConn = Server.CreateObject(ADODB.Connection); PJAM_K;
dbConn.open(DSN=HT;UID=client;PWD=passwd); K/$5SN1
rs = Server.CreateObject(ADODB.RecordSet); {Hz;*1?$k
var sqlStr = select * from signaltab order by code; T3t
w.yh
rs.open(sqlStr,dbConn,1); QG5c>Q
if(rs.RecordCount 无符合条件记录); ,7;euV5X
Response.write( ); Wf=hFc1_@
} }^`5$HEi
else { EJ(z]M`f
Response.write(数据查询结果); <1<0 odB
Response.write(代码分类备注); REPI>-|
for(var i = 1;i +rs(code)+); =<Ss&p>
Response.write(+rs(class)+); Y ^5RM
Response.write(+rs(memo)+); 8-9<r
Response.write(); [x0*x~1B
rs.MoveNext(); w}U'>fj
} cRSgP{hy
else break; b<BkI""b
} "YN6o_*]
Response.write(); dK]#..
rs.close(); o[g]Va*8
dbConn.close(); ue -a/a
} G*g*+D[HM
WyUa3$[gO
&