一、Asp基本知识
$ n+ j5 [; a, R1 R" f3 W
6 ~4 r7 ~' b; `3 o6 L, h
% D. Z) u& M. j! X8 D; m* V# C2 K3 L/ H. L3 V
1.Asp是Active Server Pages的简称,是解释型的脚本语言环境;
' P1 L. K2 Z) S) B. X2.Asp的运行需要Windows操作系统,9x下需要安装PWS;而NT/2000/XP则需要安装Internet Information Server(简称IIS);
' t9 V- P* s- V3 p( z( b0 B; K+ J7 w
3.Asp和JSP的脚本标签是“%%”,PHP的则可以设定为多种;
7 p' ]4 L, i7 J$ D
4.Asp的注释符号是“'”;
( l! q0 F7 S& |" g' N5.使用附加组件,可以扩展Asp的功能。
& a6 D8 G+ I) j, O6 T$ x$ ?
0 A8 i) F$ N4 W# _; B例子:
* [' x1 @5 j( T ~( U9 Q5 r% F, K) n" I- R6 a
HelloWorld_1.asp
/ A/ }# M' a" i' E%="Hello,world"%
. x3 z' _2 Y, n# Q8 S5 s* @) l/ W) x
3 E) T$ M2 M0 Q b. ?) r效果:
* Q# G. }2 {; |; w& k: L
Hello,world
. ]1 L- O! Q: c4 ^. M p
3 v. I' ~8 {- W' J- N6 d. z; K: w8 a9 X* ^1 F8 l `' T
HelloWorld_2.asp
/ A& W5 S$ U3 f( d# Y
%
0 Z) i$ S2 p% ^# x( I) p
for i=1 to 10
3 Y0 ~) D& a+ H! R1 r8 r" Qresponse.write "Hello,world"
4 M8 l# h- Q( N) t
next
& S% Q8 d: D: H8 Q7 C1 Y%
: P& q Z9 m8 j9 k
! O1 K; j4 W, E1 V, g效果:
1 F% M* d) l# T' ^" E7 G+ ?
Hello,world
% E) A. D# y) _5 u# U; x9 a0 W4 w
Hello,world
: S* [9 [) v0 w$ Q8 h5 CHello,world
9 S: p# P: f+ t1 W- ~% q4 P+ EHello,world
' C* g$ u3 s [7 y% T6 SHello,world
[. l( T8 r7 KHello,world
' i) T0 }: w$ I( p+ ~
Hello,world
: |4 B2 G- n% A1 y( r* _" A
Hello,world
. X2 c) P0 P3 ^9 R
Hello,world
+ D* W$ E4 ^# r# S
Hello,world
# C \0 k. _- W$ l7 u5 x* ^% k/ |: w* R
注意:Asp不区分大小写;变量无需定义也可使用,转换方便;语法检查很松。
]5 L; h9 m" v/ L1 ]$ I
8 S3 }" d4 M0 g# a& R8 @' _7 ]/ {) @' a/ ]6 g
二、Asp内置对象的使用:
* [$ L3 o2 G7 \+ v) h
. e& H) c, i6 D. s可以使用下面的任何ASP内置对象,而不必在ASP脚本中特别声明。
4 b7 \1 r. O8 b6 h0 t1 W
( o; r7 |" |( ?5 v1. Request:
6 r2 N. A' T7 w6 n% b8 F3 ^- r6 ^/ l' B; e
定义:可用来访问从浏览器发送到服务器的请求信息,可用此对象读取已输入HTML表单的信息。
5 p# t* @6 { a8 p' f; h* K# z' [! y' _
集:
- q4 {- i' G/ ~; N! x3 P( o
Cookies:含有浏览器cookies的值
# V! W1 z5 C2 b: V3 zForm:含有HTML表单域中的值
; v2 U' [3 a$ M2 d' @
QueryString:含有查询字符串的值
7 z6 h. q' L r
ServerVariables:含有头和环境变量中的值
& c/ {% v6 Q. |4 [& o( z2 \& [ K
$ [% @0 K, T& P4 K) v5 K5 y
例子:
' A: s/ h% I0 ?' c! t; o. Z3 F: |
2 q9 Y3 H* X. z, W8 r' u3 V5 e
request_url.asp
0 D# M0 e9 _2 ]. F4 @%
1 I l( G) D) q7 m, y i'获取用户输入,并存入变量
* b' Q5 ?* p" K f* h
user_id=request.querystring("user_id")
# b! p$ G$ F" J- y- Duser_name=request.querystring("user_name")
( E) u: A% u c; I- h
* @" x# U4 f5 s5 b'判断用户输入是否正确
2 |9 ?2 I7 t- lif user_id="" then
% L, e$ `$ I; E n
response.write "User_id is null,please check it"
; d7 \9 Y" x7 ^' O, [8 e, Q% vresponse.end
2 o$ Z, o- E4 P
end if
6 j, _- i7 _9 X
if user_name="" then
. O2 p! c2 B: A7 M+ K
response.write "User_name is null,please check it"
! |0 b5 @& s1 n$ }; [5 ~( Jresponse.end
2 Q# }, @2 X R( `) S; ?
end if
4 H$ D g- a0 k P# F
9 q" ~- W$ M9 l! a9 h
'打印变量
. `6 H3 }# H7 w3 q
response.write user_id"br"
$ s8 F1 W9 x6 k* X2 B5 J8 s& F. Bresponse.write user_name
$ U; A& o- `8 u5 n2 O
%
, h& m1 a8 x& {/ A0 C* ~0 p+ ]: g6 X2 G A/ K' X
效果:
3 T( J: J* o! U5 K/ G7 | b5 v当访问http://10.1.43.238/course/request_url.asp?user_name=j时:
/ H. [7 ^- y& g( ~7 m8 j6 ?- B! y
User_id is null,please check it
7 s. i2 U; |/ ~* E当访问http://10.1.43.238/course/request_url.asp?user_name=juser_id=my_id时:
: {2 ?$ G7 a7 e5 i' U, L+ l' U
my_id
; v6 r; s/ I- Z* }j
9 R( I2 |; T# [3 J1 g1 p& L; F; X; _- z# U
思考:变量是如何在URL中传递和被Asp页面获取的?
$ ], k3 u- p# y; O) z3 P) x, E
% D$ X& L) o) F" P6 c1 \
. B% l1 W0 Z! |0 h% z# T9 Arequest_form.htm
' O! p; p8 ?0 G" l* x- |6 dstyle type="text/css"
# I% b: x. Y3 r
!--
; I1 n+ Z1 f8 M3 F2 ]: F.input {background-color: #FFFFFF; border-bottom: black 1px solid;border-left: black 1px solid; border-right: black 1px solid;border-top: black 1px solid; color: #000000;font-family: Georgia; font-size: 9pt;color: midnightblue;}
* N$ h0 I" R2 Q. L6 e' t
a:link {color: #1B629C; text-decoration: none}
0 I% M* X4 H9 j4 A& [' |9 D1 ~7 ~ w
a:hover {color: #FF6600; text-decoration: underline}
8 R1 V* _4 c+ C3 r, P+ V5 i- ?5 ja:visited {text-decoration: none}
" }( V8 H+ C; }, l" o
--
) p; K) E* A% B' V% [! B& C) _6 o/style
/ Q [ F% J2 S* J8 G
% K. R6 ^ h9 ?) L }& qcenter
, g6 O. L1 j5 D( kform name="course" action="request_form.asp" method="post"
/ z+ D$ D) @& T6 n$ DUser_id:input type="text" name="user_id" maxlength="20" class="input"brbr
% Z6 c9 F. U& } y
User_name:input type="text" name="user_name" maxlength="30" class="input"
1 v5 C) e/ U+ z$ R' r/form
2 u# L3 O$ W0 e) k& Wbrbr
: n$ e) [$ ~% E8 d W. va href="javascript:document.course.submit();" 提 交 /a
# L, J' T! b# ^
/center
- h* I E M" v) w' J9 D
; K! N5 }' N R: i1 R
request_form.asp
9 Z- t# l9 m0 \& f* n& F7 {%
- ]! f" s/ r6 I: h, D3 X; ?'获取用户输入,并存入变量
8 ^; Q8 y8 H, q. v, g- Wuser_id=request.form("user_id")
1 W, n% b7 q- \. xuser_name=request.form("user_name")
! ?" u( W; b; h4 `( R' B: M
. q, Z, s5 c9 b; B' L1 g/ D& E, D
'判断用户输入是否正确
, ^% y, m) g. j1 xif user_id="" then
# W& ?2 K& d7 uresponse.write "User_id is null,please check it"
% u" `4 L, t% I1 H; ~
response.end
: v, s/ Y' h1 \. L1 E2 _end if
+ k+ b: l ~& R9 {if user_name="" then
- H- M) _# m' }; g5 a; e' g% B
response.write "User_name is null,please check it"
- e w6 s* [) _2 r; _
response.end
" r& ^! D0 c: dend if
6 L7 \- W& b: x" ?/ e( N! u
+ ^" S% u' { n9 Y'打印变量
. n& h; j5 ?( r. W( L1 N* l. e6 e
response.write user_id"br"
1 \' h3 B& I1 C9 eresponse.write user_name
: Y8 d3 b0 _8 T6 Z" }6 s; Q' ?4 s. ?
%
& q( L$ x1 w( n* _( B- E3 u$ I) j! R0 q4 q K
注意:form的action的指向,request_form.asp和request_url.asp在源代码上的区别?
+ i2 `5 B. J4 R* ^8 a) E* L$ ^. Q# I
. \/ Y, Q5 f# o/ r" V2. Response:
7 Q& S. {' d5 j) {9 d- T/ d9 f4 r" c- \+ ~/ p
定义:用来向浏览器回发信息,可用此对象从脚本向浏览器发送输出。
$ y, D& Z) X- r/ |$ }" u* j" n
- K+ c2 r; U; }# C, n, M# m! I
集:
% r" I# \, z1 m6 V. ?9 a4 o; `1 ]
Cookies:在浏览器中加入一个cookie
2 Y7 Q" a1 I' D/ O6 Q, F+ w/ R4 r
6 G& } X1 c0 W1 n# t
方法:
! V7 h. C) a H& ~/ Q! {/ h9 ^End:结束脚本的处理
. u/ c0 G# y" f. B
Redirect:将浏览器引导至新页面
9 A' T6 o3 d4 q# W* F1 OWrite:向浏览器发送一个字符串
. I: y9 G7 m$ r/ P+ O) L% B8 L' u( a4 q: H
属性:
, ~8 t8 N; k: a' I. L4 p9 P3 dBuffer:缓存一个ASP
* f8 J2 |: [/ e5 U% G
CacheControl:由代理服务器控制缓存
* ~4 o/ y" D2 n" GContentType: 规定响应的内容类型
# q5 y8 [5 i+ i4 y2 \
Expires:浏览器用相对时间控制缓存
$ }5 S D/ t2 o3 s
ExpiresAbsolute:浏览器用绝对时间控制缓存
0 x- R8 q( J, I4 r5 @8 B% e
( @, B5 O7 W+ R6 o: }7 P6 b
例子:
1 P3 ?6 B: H* c! `: c
6 E$ S- {: P4 E6 V# Q5 N1 E) P/ h. ^
response_redirect.asp
. B& H/ l! ^* l2 s
%
& h( b) ]7 ?8 V4 |. C' M'去google看看吧
8 _9 O! W G8 C4 L+ cresponse.redirect "http://www2.google.com"
: p( t. m7 x+ ~2 _$ J8 ?+ z) [6 ]response.end
/ |5 c, t' c* u8 v
%
9 ~1 E$ A& T: [. F. n) q1 v
& w: \5 N- R" n" f$ O" o$ Y" L- q. _
# j& h4 y1 z" n7 F* p" Iresponse_cookies.asp
: W6 I5 I2 p, v6 g1 X4 ^%
* G# W A6 ?! r- e'设置和读取cookies
2 |+ w6 r) ?% W7 ~ a# Bresponse.cookies("time_now")=now()
; `: ?1 a* _: q! [, rresponse.write request.cookies("time_now")
0 W+ j2 _" n) S( J6 `%
3 ]2 \2 D1 C5 H) S: } P
4 r( \. a' E# F3 z效果:
7 G" h. A. }5 Q# C$ M& k当访问http://10.1.43.238/course/response_cookies.asp时:
) n( m% W; s! n6 L) N G2 K
2002-9-1 16:20:40
6 j8 F* n8 i! n% ~
' i$ |( `+ O% u! H. K \9 g( n/ \* A% d6 f& L2 t& U2 A9 R# O
response_buffer.asp
1 y' \/ j# B4 E" a
%'response.buffer=true%
" r# s r4 k# L5 B- _, V8 u- N7 ha href="a"a/a
# x: i8 X) u& V1 n& i& @
%response.redirect "request_form.htm"%
6 ?, f5 I8 s4 G9 K6 Z0 Q1 A
* |* N8 f: b- l# M8 @, ?效果:
( z; {* G7 {; h: G3 T
①.当关闭IIS的缓冲功能,访问该页面时出错
5 H9 m( U& T- T. F' Ja
& h6 s% u6 E6 j' Z6 d R' S答复对象 错误 'ASP 0156 : 80004005'
2 M1 g5 o- T, }
头错
z( `! b* a1 y/ p/course/response_buffer.asp,行3
+ `$ n- x: q K9 o0 O& Z' lHTTP 头已经写入到 客户浏览器。任何 HTTP 头的修改必须在写入页内容之前。
+ |6 Q& _9 r) f6 ?" t& g
②.当关闭IIS的缓冲功能,去掉文件第一行的注释,则页面重定向成功
/ N9 g- Y$ h0 U* d
③.当打开IIS的缓冲功能,无论是否去掉文件第一行的注释,页面重定向都成功
! J) u. a0 U( Q& B0 m
1 ?8 D0 B) ^% Q
3. Server
9 i2 X+ A& |5 f2 L0 a
( s2 Y# G. e; r' z定义:可在服务器上使用不同实体函数,如在时间到达前控制脚本执行的时间。还可用来创建其他对象。
( Y* e7 L1 a7 k! W5 T
) y6 R& H% U: o7 E* d
方法:
; J/ K& [9 @" Q: E/ y) X
CreateObject:创建一个对象实例
) h0 t+ o1 }1 f R) } t5 DHTMLEncode:将字符串转化为使用特别的HTML字符
2 A$ D( J* U! e9 R. G/ AMapPath:把虚拟路径转化成物理路径
) F$ K1 A" ^0 ~: P9 u( r u7 M- g
URLEncode:把字符串转化成URL编码的
( @& o) R9 D! jScriptTimeout:在终止前,一个脚本允许运行的秒数
5 l8 h u$ @/ |1 l6 v8 o3 ?7 H ^: o" M) g4 t3 E
例子:
7 e) c* J- w& G# s" { y# \
% A8 Z+ @9 T# ^( Nserver_htmlencode.asp
* x) v' L1 }( R$ \7 p- W Z: j% T8 Z%
w! d! E# t6 \& F/ j$ @9 m! R4 p( J
'html encode
. C5 y, \' N! k5 x
response.write server.htmlencode("a""time_now")
' ~( c( v* m* l* S; K3 A; p%
2 v: c" e; q; _7 B9 A
, s- W6 f$ M+ g% u2 o/ ?1 J' Z效果:
% W P: [/ _, Xa"time_now
/ k1 F# |, I$ e/ z) c
查看源文件时显示为:a"time_now
- H: w4 K- I2 o; z" T. ^
- C1 l* h* f/ F4 S$ f7 p. f思考:为什么不是a""time_now这种效果?源文件是怎么了?
2 `2 u4 W/ l( S& o" c! J
0 A) b% I/ x$ r) }
4 V- A! v2 s" Z/ f! H3 A0 q
server_mappath.asp
5 ^; V3 A" x4 r. m+ k
%
! b& R: Y& t( T0 f'mappath
0 ^2 z h& s Z: R
response.write server.mappath("server_mappath.asp")
/ P! }- _' |$ z* s+ y" a
%
" e5 B5 S. R9 O8 N" W: z( S: [" A- M8 M o/ P4 M6 J: K
效果:
/ F; z! j7 a8 V! N, L
G:\asp_www\test\course\server_mappath.asp
1 I( z+ y& u6 }* d- E" R. p3 t4 S3 P8 e; L$ O( G' d& I/ _* z
思考:如何获取站点根目录的实际路径?如何获取某个目录的实际路径?
' T6 f5 ^; t/ j# W4 b, t% o
% }8 B; x4 v" j9 Z" p" e# M( F! C( Q# E
server_urlencode.asp
4 b- {0 ]/ D! B3 g9 p
%
1 A0 ]* y" b/ B( N' O
'url encode
6 ~/ o5 _+ i7 Y$ }response.write server.urlencode("a\time_now")
+ T. S3 {& d% T. U
%
% l7 b: L: m& k7 r
. W5 K( l2 w" f! c7 i效果:
+ W2 }9 ^: w' R" U6 f, n
a\time_now
2 W* B' f0 {5 G# G( ~
1 c$ r; V0 u: s1 D" ~4. Application
6 @3 m5 `; l, x0 X f9 r% K- O; m8 c2 c9 Z' p. l/ s0 f( O
定义:用来存储、读取用户共享的应用程序信息,如可以用此对象在网站的用户间传送信息,当服务器重启后信息丢失。
1 B: w& B; p) |7 D( R) k5 g' a& @" N; g
& B* x& E3 p6 f
方法:
' L5 d5 @3 M4 y7 Z. q# l! W9 s
Lock:防止其它用户访问Application集
! \" G5 m _2 O M* H0 ?/ o
Unlock:使其它用户可以访问Application集
# I6 b) e! E4 v% B" s
# R4 @$ V8 N9 u# b9 h- I$ b事件:
* b1 i- o. S8 Y# j* C
OnEnd:由终止网络服务器、改变Global.asa文件触发
$ |4 X, S( j; @+ p, d+ NOnStart:由应用程序中对网页的第一次申请触发
5 w/ e- P; }. e( E7 A3 @0 ]3 q: j
0 g, ^5 i! H+ {# l例子:
+ b* t8 b% @( b% a$ k5 f& T0 i
% H3 L0 ^5 p8 |* e qapplication_counter.asp
5 g) }8 G C; J
%
& |7 I5 E2 K4 T! q
'一个使用Application制作的简单计数器
4 I: ?: s: `& ?6 T* ^2 T% a! i. {Application.lock
; V& {; f/ ^! h* oApplication("clicks")=Application("clicks") 1
2 h/ z6 R# w; A3 l# c
Application.unlock
& ?8 N% G' w. v; J6 Y9 W9 h
: p; v+ k1 k4 [+ t; G/ k/ L/ y
response.write "您是本站第 "Application("clicks")" 位访客!"
$ u# L$ Z; {8 I Zresponse.write "brbr您来自 "request.servervariables("remote_addr")
2 L4 P5 m6 C' ~/ D! n4 } z( t
%
3 `& ~# K# d0 D" b3 v, [3 @; ?* `
3 M) w k) |$ m3 L效果:
! {: \. ~# g/ Y% \. I您是本站第 1 位访客!
2 ~ A" L& |" `
4 R4 L1 ?: x) I$ G) x: C您来自 10.1.43.238
, h5 H6 J; M7 n U
( g) w# L: V2 v- ^& _思考:本例中lock和unlock有何作用?
) C( a2 H* \6 t5 @6 D$ X5 Y. w( n: D
5. Session
/ I5 z& E( U+ s
9 I+ c' K8 R% Q ?0 r! ]' s- r定义:存储、读取特定用户对话信息,如可存储用户对网站的访问信息,当服务器重启后信息丢失。
' q0 ], u" V( x2 k. _( q" w. j1 w, z4 d4 s3 I
方法:
2 y( Q2 F: `, [Abandon:处理完当前页面后,结束一个用户会话
" f Z- q% a3 x9 z! c" \' Z5 H
; f% M, [$ f7 c/ Z0 G属性:
' |. i" Q2 i1 x$ S0 M# }& }Timeout:用户会话持续时间(分钟数)
) l& t3 ^" t) Q: H
) w9 e' x* N) t$ Z
事件:
+ Y. d; Y' ^; [; |; A, d( p. ?2 @8 uOnEnd:在Session Timeout时间以外,用户不再申请页面触发该事件
8 x" L8 Y, d3 y
OnStart:由用户对网页的第一次申请时触发
2 H% q4 S K7 F5 F2 G: p; f
1 h9 `7 ^8 K t2 }例子:
2 K' I: Q" w( _& S x! O4 w0 t q
2 J- }7 H. U5 d+ Qsession_counter.asp
# Q* a! h# \' j/ {* c8 J p) T
%
7 s' s2 @: r3 x& R+ C% K
'一个使用Session制作的简单计数器
0 k7 ` ~& @& r8 K) |+ q7 }
session("clicks")=session("clicks") 1
' z5 y5 ]4 h1 q4 ~: F; A' i
1 L2 t8 L! }1 C9 s7 a3 t3 K' |response.write "您是本站第 "session("clicks")" 位访客!"
0 t% b( r" [; D
response.write "brbr您来自 "request.servervariables("remote_addr")
0 z* |6 |6 k( l%
9 k& S# W9 t5 Q; @3 q
8 d( }' M# i1 t, _效果:
/ a0 |* c) c$ O
您是本站第 1 位访客!
) l J8 c1 J% P& U m( v9 W- X
/ Y# W, N1 h, G您来自 10.1.43.238
* ?# ? W5 q; e2 |; C7 |
: P: c/ q0 Q' V- K思考:既然session和application都能做到计数,那它们之间有什么区别?如果要做到满100重新开始计数如何实现?
! \5 r. [6 ?2 p! ^
3 ]' U8 @- Y, l9 t) E: D: W三、使用Asp操作数据库:
5 ^$ `; P5 c, f. r4 U
! X2 m& [# ]6 G* c5 J- d1.通过ODBC或者OLE方式连接的区别?
- d. @/ O2 J5 {$ Z* x, J5 c
$ j; z2 ]( q: W! X4 L# a. W现在有两种连接数据库的方法。一方面,可以用ODBC产生一个连接,这种连接与任何有ODBC驱动器的数据库(即基本上是市场上所有的数据库)兼容;另一方面,可以用原始OLE DB提供商产生一个连接。
x4 w$ O/ k# n- M
% P6 C! V" y' z6 G, L7 N$ Y$ y$ ~该用哪个提供商?尽可能用原始OLE DB提供商,因为它提供了对数据更有效的访问。Microsoft正逐步用OLE DB取代ODBC标准,应该仅仅在没有原始OLE DB提供商时使用ODBC。
: O( R9 v4 M6 e) k1 h
) k; x2 _6 B5 k1 O8 P⑴.用ODBC方式连接SQL Server:
) G2 o1 s) z" U% B) J
①.配置ODBC
9 u( B9 |" I5 d, ?
②.连接代码:
) {6 g% W/ N# r# ^- |! f
conn_odbc.asp
" \& Q9 e; A, d# k%
. m3 H- q( B- YSet Conn = Server.CreateObject("ADODB.Connection")
" ?! }! m/ e/ M4 U" Z( \
'Conn.Open "DSN=course_dsn;UID=course_user

WD=course_password;DATABASE=course"
2 ?3 h" B( s# J) f0 }; z8 g
Conn.Open "course_dsn","course_user","course_password"
) u0 O2 U9 I& m4 h6 _0 m
%
% O5 j; L/ f+ e5 V注意:在配置MyDSN时若指定默认数据库为course则上述代码作用想同,否则第二行的连接方式更有灵活性,可以指定连接某个数据库(当然,前提是course_user对这个数据库有操作权限)。
! E0 y x& ?4 g# k% t
! m* D5 i+ G/ |3 o' L: I4 \⑵.用OLE方式连接SQL Server:
0 E9 n; p8 Z& f: z. ?conn_ole.asp
* ?0 F: a% b- f% \0 L+ b8 L
%
5 X, W' B5 K8 Y( R
Set Conn = Server.CreateObject("ADODB.Connection")
1 s. M* D% W% D* P+ {5 U- bConn.Open "

ROVIDER=SQLOLEDB;DATA SOURCE=10.1.43.238,2433; UID=course_user

WD=course_password;DATABASE=course"
% ]# J5 z$ g1 d2 m%
: D& W$ A/ B4 e( J
* X- _" C6 l7 q/ j2.操作数据库:Connection和Recordset
6 b6 T4 a( \8 G- L& e+ M& O
7 {4 E6 ]6 I% v& f联合使用connection和recordset操作数据库,或者只使用connection操作数据库。
) b G; b4 D: B, R% x2 i* Z1 d) L1 g) Z+ B5 J# {
例子:
7 G, | _# {# a" z) g
, b) b- N0 m0 B/ h W! Z⑴.联合使用connection和recordset操作数据库
/ q* G: Y6 C# d# b1 g1 r
6 I" @$ u) c! i4 D4 X/ ^# Duse_db_1.asp
8 m/ [( w, m+ J% ^) A) C
%
9 W# f! J. w! R' v Y! V) R
Set conn=Server.CreateObject("ADODB.Connection") '创建连接数据库的对象
0 F8 \% |" T4 y/ ?- U+ j
conn.Open "course_dsn","course_user","course_password" '使用该对象连接数据库
& Y: ^( J% I- u- o2 aSet rs=Server.CreateObject("ADODB.RecordSet") '创建记录集对象
0 `" y' S) F: t# j& {
rs.Open "select * from user_info",conn,1,1 '使用记录集对象打开数据库
* l6 H- h; h; X7 l& rif rs.recordcount0 then '如果有记录
5 Q8 |% W1 t5 u2 ^5 bresponse.write "User_id User_namebr"
- \3 @7 o" L! u! b% t
for i=1 to rs.recordcount '循环读取所有纪录
; K+ _) D. C. _6 v8 J
response.write rs("id")" "rs("user_name")"br"
* m4 {# s8 ^3 O% z7 ^
'向浏览器输出纪录的字段
! k" S" P/ {5 p2 T8 c
rs.movenext '指针下移一行
~, S6 E% G1 D( _8 W
if rs.eof then exit for '如果到达记录集底部则退出循环
1 M R8 \* H/ n
next
2 A. k% g1 `/ S6 v
end if
0 G' K) t1 D- x. w& H%
( q* w, \2 ~* ?- k. d* N. Z
( L+ D1 C( p( ]7 u, @7 [! l
效果:
- v, J, L) V! Y6 |4 \User_id User_name
W7 ^" X0 `1 h6 F
1 ahyi
5 y% b% O: Y$ u# J& h2 Q3 test
* k& |9 R( [( p/ }: U
* J" e( i% Z1 z( ?/ I; A
. U$ D& b3 E; t$ k+ C/ A y) k( \, X
⑵.只使用connection操作数据库:
) O1 Q0 t0 G# |
1 u4 H- t& j7 Y! g2 Quse_db_2.asp
, Y3 |2 z& u, h. ?" u
%
& ?3 p% ^7 w) d* k6 m a9 U6 G
Set conn=Server.CreateObject("ADODB.Connection") '创建连接数据库的对象
5 u& l! }" u% }* U5 Wconn.Open "course_dsn","course_user","course_password" '使用该对象连接数据库
6 {* A0 y ?$ D$ b/ k
conn.execute "delete from user_info"
) ~& d0 a' |+ M& L1 w1 d% N6 t%
+ l" c) T" |# m
: ]7 v' H' |" a7 I2 P' b
效果:
$ i8 A* ~' v1 k4 ~! }2 n% kuser_info表中所有数据被删除
) ~. b( e. P+ G* F* _
1 j$ r! K, k, Y" ?, w思考:两种方式有和区别?各应用于什么场合?
7 t/ p. W% W/ c" r3 K& u* E- i: v! S4 F( B
3.如何使用事务处理、存储过程和视图?
" W# B. I. q) X5 J
/ k2 E' D7 L3 K2 S/ O' [9 [⑴.使用存储过程
5 }' X1 ?9 e: w: Q& A' w7 N' A7 {# ]$ B0 I5 K9 Y3 q7 Q! m
①.定义好存储过程
* Y' I* G: K9 s9 j$ }3 p
- W& ]- o4 h3 S, R- oCREATE PROCEDURE [output_1]
# G+ {. e( K6 v. k' x! F! J5 w@sid int output
4 w$ A5 z8 q- n* k9 e% o- E; R
AS
9 ?' _( ~( o# O/ C' b6 H/ }
set @sid=2
b$ P" }7 u" \* X( D q. b& S/ J8 g& X% B! O. K
CREATE PROCEDURE [return_1]
3 `, ?9 F$ O0 p7 K' b$ G1 O& q* w(@user_name varchar(40),@password varchar(20))
7 e& n6 X# c( q' C+ KAS
& L2 ~/ x) K9 q P, y3 h( cif exists(select id from user_info where user_name=@user_name and password=@password)
" O. v1 F$ }$ R, N) s3 s' I# N& @0 ^
return 1
8 r/ n9 I* j* z9 t
else
4 E( @5 ^1 j f: r4 r
return 0
2 H3 M6 {6 v. _5 ^6 ?" z, @9 g% W* y) r& ~/ D
CREATE PROCEDURE [user_info_1]
/ J# W, W: O- D(@user_name varchar(40),@password varchar(20))
% C1 O( V9 h2 r. x# B3 Q6 TAS
" G- M# S, A$ b6 Y( k2 Z- }/ K& `: a( x
select id from user_info where user_name=@user_name and password=@password
' \. f d2 D6 l! N2 m E0 `
& i) H: z4 h @$ A* O
CREATE PROCEDURE [user_info_2]
$ T; u' V/ H+ c2 q, R3 l6 b2 r9 g
(@user_name varchar(40),@password varchar(20))
; O! Q% n( R% C2 \; YAS
& a5 k( z! h0 z' M N- ^4 F( t
SET XACT_ABORT ON
* d5 x/ f- W! V. F3 x2 H% P3 E5 q
BEGIN TRANSACTION
: f; q: S. B2 W% u. g+ ?1 P
delete from user_info where user_name=@user_name and password=@password
2 X8 e G6 W+ n2 f T. c3 yCOMMIT TRANSACTION
4 B9 H4 V8 ^0 x/ o. C6 A7 r
SET XACT_ABORT OFF
/ h/ q/ x2 x8 n5 v4 M, x2 ?" i0 `5 ?* v; K
CREATE PROCEDURE [user_info_3] AS
% G! B/ v$ ]1 i
select * from user_info
) |! d$ O, T3 v* {# O! n
& {% s( o# j$ h5 s9 j: [! Z" j②.在Asp中调用
, z1 U. p( E4 G" N8 k s% a, x2 q
$ J4 R+ Y: F5 d: @7 o! u* {$ f2 C
use_proc.asp
& Z5 a$ Z" C: `7 W. J! l1 V!-- #include virtual="/adovbs.inc" --
& ]; U7 j! t$ F7 E' ~$ O%
* V2 t, w2 g$ I+ ~4 q+ [% B! DSet conn=Server.CreateObject("ADODB.Connection")
2 W6 U9 l7 s$ j$ l! \conn.Open "course_dsn","course_user","course_password"
) N3 U7 Z5 E- N- g8 f* u- |
0 m. Y" D# V5 @% S5 ]- |9 T+ j'使用recordset调用带两个输入参数和返回纪录集的存储过程
/ G8 _3 ~/ K) F! J' T) a'CREATE PROCEDURE [user_info_1]
7 y% w/ b5 q6 t* q( {3 ]/ S/ f. W8 b! x'(@user_name varchar(40),@password varchar(20))
" O% I H# l# C& L: w/ o'AS
) Z5 s- R* D/ `# k5 s/ I) N'select id from user_info where user_name=@user_name and password=@password
2 m# N' ?) Z$ F$ ` \) s
response.write "普通的调用方法:br"
6 A5 u: r |# g5 u6 A! ^" t0 mset rs=server.createobject("adodb.recordset")
% H3 k+ B" p/ h9 m- i- A2 ~! l, a
sql="user_info_1 '"request.querystring("user_name")"','"request.querystring("password")"'"
- p/ x4 j x' R* i) t
rs.open sql,conn,1,1
$ u7 K- M: t& I5 v
response.write rs("id")"br"
2 j( h/ G' c; a5 E. ~
rs.close
+ w) P- f* Z1 e
0 N2 n2 ?, N$ `8 x( [! _5 Z& x'使用recordset调用无输入参数,返回纪录集的存储过程,可以使用recordcount等属性
/ |2 v7 V) z+ h) M$ e5 Z6 c'CREATE PROCEDURE [user_info_3] AS
2 f/ w1 a8 U5 f9 ^+ v
'select * from user_info
* d( B5 X' C$ d3 t- Y9 g
response.write "br返回纪录集,可以使用recordcount等属性:"
8 R, h6 B, m# `( z
sql="exec user_info_3"
- Z) ]! F3 X, _ l' `
rs.open sql,conn,1,1
8 ^( d' F+ S A K4 H8 d
for i=1 to rs.recordcount
/ J: y# M$ i0 Q9 F- f5 b% Z
response.write "br"rs("user_name")
8 `# ]: ~- e/ z# N1 O! E, brs.movenext
. w) L* f8 l: ?4 Lnext
" _/ c, x) ?. M7 U2 Yrs.close
+ b$ Z- \' w( N2 U" Y
set rs=nothing
7 m$ f) N2 W: D1 [' G P: D
! U& f" S0 J; N% i'使用command调用带输出参数的存储过程
" O' ?/ C* E7 O+ q% k/ V'CREATE PROCEDURE [output_1]
) v- x; R) }- e5 D' ^( m1 y" o
'@sid int output
9 U* Z" J8 o9 H0 i) b v( v
'AS
0 v% Z \9 I6 l' {( k8 {, v6 A# R
'set @sid=2
/ w/ O- g' I. t- O
response.write "brbr调用带输出参数的存储过程:br"
5 @3 I5 _9 J$ Y7 K: t
set cmd=server.createobject("adodb.command")
, } C) H4 W; E: X& q; V
cmd.activeconnection=conn
4 F& x6 F t. N7 B6 Z8 j: Scmd.commandtext = "output_1"
! G/ @) V/ U/ T, ~' I- Icmd.parameters.append cmd.createparameter("@sid",adinteger,adparamoutput)
Z2 D. o3 o1 h
cmd("@sid")=10
( J) A3 V! \5 v0 N
cmd.execute()
) h1 y; c% R. `1 Q
bbb=cmd("@sid")
8 F* }' {& U& g# X9 ]* P4 ]
response.write bbb"br"
/ X$ _+ j" o6 H( y( _
set cmd=nothing
0 v) J4 H7 T" O* d& Y2 M# T
/ J$ {0 M- [# u0 s+ e5 N/ x& h2 v) T
'使用command调用带两个输入参数和返回值的存储过程
% \6 A3 G" W9 {1 T( ?3 V$ q0 G
'CREATE PROCEDURE [return_1]
; a! k o. O d'(@user_name varchar(40))
) r- M+ C% s, _/ F: d6 ?
'AS
' E1 s( x# |+ K% l P
'if exists(select id from user_info where user_name=@user_name)
$ I7 |$ ]: }( ?1 v'return 1
7 |5 M6 D2 A8 h3 N, k
'else
) ]- S* d2 n( `- q( p/ J& i'return 0
2 _. K" D$ E. Q# A6 m! K" lresponse.write "br调用带两个输入参数和返回值的存储过程:br"
9 A# j; V# u4 Y' A4 A3 ?
set cmd=server.createobject("adodb.command")
9 [& h1 J- r+ l) \0 v& Gcmd.activeconnection=conn
7 X1 ? ^/ @, Mcmd.commandtype = adcmdstoredproc
2 R: U# S1 |4 `" ]cmd.commandtext = "return_1"
' A' j5 e. ?: }7 |cmd.parameters.append cmd.createparameter("@return_value",adinteger,adparamreturnvalue)
1 c( A" l+ k" y2 y S+ r4 Z
cmd.parameters.append cmd.createparameter("@user_name",advarchar,adparaminput,40)
4 Q6 e L4 C& U8 R! w3 v+ o
cmd.parameters.append cmd.createparameter("@password",advarchar,adparaminput,20)
* }% u! d" C, j7 _: ~/ J) C) M
cmd("@user_name")="tuth"
( K) c: ]& N+ G% j a. qcmd("@password")="yyuyu"
( g0 @2 l# \6 b, `7 m# `2 h% @6 E7 }cmd.execute()
9 p1 {' `8 _8 _) a" }, irrr=cmd("@return_value")
+ K2 `. R& ~' l: f
response.write rrr
# O: ? |) ~5 O0 S( h/ j9 E2 U
set cmd=nothing
/ Z2 X# P) L$ v& s
( T" N4 |% n9 {8 n- Pconn.close
8 ~3 r3 r, ~3 W$ ?
set conn=nothing
2 F( D! m4 o, W%
/ w( P" m; E! R" o+ B) U$ l' V9 i/ ~) D& @. x" v$ P
效果:
7 g; X' }6 T4 {* O" p3 i( i! R访问http://10.1.43.238/course/use_proc.asp?user_name=ahyipassword=ttt时,出现如下
; e. P) z# q9 P& r& m' V5 y9 _' B3 e9 V" x5 L( P2 M
普通的调用方法:
' R# H$ Q" F# b4 p. X* z {! Z
12
6 q* F: f/ w5 i" W8 M9 q5 V/ _) t3 p" C8 U8 l0 {0 x
返回纪录集,可以使用recordcount等属性:
/ o' o: }" B/ ~( U, g# E9 W3 cahyi
9 m: M6 c5 \7 {4 P, E" U- [ J$ Jtet
' X2 f% @# ~, h) dtuth
7 e' E Y9 c! o2 E- z3 P
8 L; O% @: X4 G* ]" R, V" n$ f调用带输出参数的存储过程:
: i4 m3 K6 B) S4 U. }4 ~( x
2
1 E' F6 m0 D: `/ j- }
5 h* O; A8 ]% x
调用带两个输入参数和返回值的存储过程:
1 l7 j ]9 I) Y6 W$ D1
) g* E k# V/ G
3 B4 F' u& f& y2 M注意:若存储过程无参数,则调用的sql语句直接为存储过程名,一个参数为“存储过程名 参数”,若是多个参数,则“存储过程名 参数1,参数2,……,参数n”;如果在sql语句中加入exec,则在返回的记录集中可以使用recordcount等属性;如果想获得存储过程的返回值或输出参数,可以使用command对象。
: _; g- N$ ]8 L+ F
: i4 i" y: B4 e6 n/ v⑵.使用事务处理
# x4 s- f. t" y$ Y3 b" [' a
" I) c& y2 \9 ^6 r0 n! e/ v①.Asp内嵌的事务支持
' Z4 K, m+ X/ l! @5 v0 E3 M4 i
5 h& F" a: Z4 i" M4 k" ]$ g7 ^例子:
# y- \5 f1 p4 W1 B9 _use_transaction_1.asp
6 M1 x& @ F$ ?2 b" Q; G5 U, R
%
# f/ U( ^4 Y$ z3 U8 n+ P4 V& @
'Asp中使用事务
, j, N- k# P' I& D) y
Set conn=Server.CreateObject("ADODB.Connection")
# r1 l9 A+ f0 Q2 e# F" Tconn.Open "course_dsn","course_user","course_password"
. l* A! Q2 p" P- @% `
conn.begintrans '开始事务
. x2 @8 V" }- d+ I& _8 }+ x( q/ k$ G( h
sql="delete from user_info"
1 q: b& u: Q( m$ B" nset rs=server.createobject("adodb.recordset")
/ }$ J# G9 R9 p% Z% Nrs.open sql,conn,3,3
2 F; S8 e! [* @1 Q" {/ I0 mif conn.errors.count0 then '有错误发生
& h: l5 Q9 |" f. n0 C( v1 Z
conn.rollbacktrans '回滚
8 i' }4 c8 A* A: J( `1 H; C5 Z
set rs=nothing
3 N- C$ b( G) D: e% T4 t
conn.close
5 X% E' k8 j" g
set conn=nothing
8 ~" ~- c, C6 `6 J, Sresponse.write "交易失败,回滚至修改前的状态!"
5 ^5 H0 ]8 S& @. t0 K
response.end
6 n7 w1 F( Q' T3 e0 j$ x9 E
else
: b5 h1 g3 { Econn.committrans '提交事务
" S8 j) s2 [7 C
set rs=nothing
! ] X8 ~7 q! _. S) D( M1 Y! L' H
conn.close
|5 k1 ]4 D# C
set conn=nothing
) \6 N+ H4 c' r4 W6 m0 iresponse.write "交易成功!"
2 u+ u1 I# r0 E- jresponse.end
7 n2 B+ t1 i( U9 C3 K5 ~8 fend if
1 w( I K) L' Q" K/ f
%
0 w! A( Y0 D, T& P2 j, A
& Z1 } o* }8 P' L' S! N8 u②.数据库级的事务
6 [; d) X1 ]2 m: G4 u
2 a6 t& E. h6 S1 J; ~
i.创建存储过程
7 w. L! |4 P4 E" N1 Q7 i
4 K. J7 w8 h# N9 H m. H3 z
CREATE PROCEDURE [user_info_2]
6 k/ x$ G0 O0 m. v: s5 y(@user_name varchar(40),@password varchar(20))
5 h$ d J; ]! q; [, h( RAS
! d3 h" C1 K( f+ Q) v8 w& R; K
SET XACT_ABORT ON
) V R( L# e" H6 z, c
BEGIN TRANSACTION
9 i) z4 s& E/ G& r+ f3 T" Ddelete from user_info where user_name=@user_name and password=@password
P! k6 R1 _/ F; O8 T& T9 N
COMMIT TRANSACTION
3 t& B @9 a- ]; W! K$ M# U" d9 }$ d
SET XACT_ABORT OFF
: x+ y' ]* O5 f( u
' o) I q2 ?. P, yii.在Asp中调用
: I' ?8 l0 g) Z- Y8 C1 U, M7 ^6 i0 a
use_transaction_2.asp
& j& h$ [; D# `: U( c6 l
%
( J& `+ N) s/ q. Q; z( E5 r+ R+ r
Set conn=Server.CreateObject("ADODB.Connection")
; D8 T1 `; x& h- ]conn.Open "course_dsn","course_user","course_password"
% Q: O2 W' S; e! L/ K# m _- ^. O: ^& j% G0 p
sql="user_info_2 '"request.querystring("user_name")"','"request.querystring("password")"'"
0 o. S3 z/ o5 E: m( k
, T2 G" U# a& H& o
set rs=server.createobject("adodb.recordset")
5 {5 Z) {+ p8 Q1 o
rs.open sql,conn,1,1
9 l# p& g' R% X0 u' Bset rs=nothing
0 K# a `! j; R8 v" p9 P; P3 ^# D
conn.close
( n2 I! X0 j/ w# u- \7 t6 j4 I: n
set conn=nothing
8 \, z$ t8 n1 B3 N( x
%
/ B" ?# v1 B3 l2 I' M& W( [( D- ?2 Y! O
讨论:两种方式的优劣?
7 V* \# Z( W* i+ X8 ^. U; C& |$ |) N/ e$ `
⑶.使用视图
0 Y! a& A, J1 m2 q: | F
在数据库中定义好视图之后,在Asp中如同使用一个表一样来使用视图
. q; E9 K4 U4 P C" i
7 l' V) ^- u2 V$ z S( |6 x4.一个数据库分页的例子
, U0 n& @0 F& d+ V0 Q! T
, B6 _4 G4 s8 A; ?9 n# O9 g' ~db_page.asp
* C/ r& O* a3 X%
1 m( ~; N7 n% H8 W% t5 m. E! hon error resume next
/ ?* R0 w/ {( d* w n3 R
Set conn=Server.CreateObject("ADODB.Connection") '创建连接数据库的对象
2 A8 [" W" P5 v' K
conn.Open "course_dsn","course_user","course_password" '使用该对象连接数据库
; @/ \& |# a6 d7 B' _# xset rs=server.createObject("adodb.recordset")
6 S3 [8 h0 c6 G( \6 n6 xsql="select * from user_info order by id desc"
, y/ M8 T+ Z6 I2 b2 e+ P
rs.open sql,conn,1,1
% ?6 v0 U* e$ e8 J0 g2 U
# G+ v5 N2 ~+ cif rs.recordcount0 then '如果有记录
6 ? i8 {3 f) v+ s
rs.pagesize=2 '每页最多显示2条纪录
$ v* ^2 n7 n3 E$ a
'从URL获取当前要显示的页
4 {! `# ]8 h+ z3 V& j
page=cint(request("page"))
( E5 h2 z, r. l0 X9 R'页面参数异常处理
2 M& I# T j% {& \2 j
if page="" then page=1
. q2 P& N2 Z! k
if page1 then page=1
( ^, ^# ~$ G; R+ N! ^! k$ p2 mif page= rs.pagecount then page=rs.pagecount
* M% Y% |" d4 N1 m/ m7 Crs.absolutepage=page '当前页为page参数指定的页
; I% ]! c' H2 T
for i=1 to rs.pagesize '根据pagesize参数的大小循环显示当前页中的纪录
7 O( |( |1 q( r' D$ ~" b% T0 k+ iresponse.write "User_id:"rs("id")"br"
( {6 `7 v# T$ g" S$ i
response.write "User_name:"rs("user_name")"brbr"
+ B! M5 ~5 u- ^% \, B
rs.movenext '纪录指针下移
3 x# _* f8 a' X6 Y* }. m
if rs.eof then exit for '如果到达纪录集底部则退出循环
8 G$ v9 ~0 C! [/ k* j) pnext
. q7 F! a5 c' F- W) z2 o6 ?) Lend if
1 U$ \* M3 r+ U3 ?: N: R
5 ?9 v/ P5 I# h% B0 v'显示翻页按钮
) ^7 |: `6 |2 c& M/ l' ~
if page1 then
; m2 l+ f% ]; v% U. \$ h- u3 s1 s5 b
response.write "a href="request.servervariables("document_name")"?page=1第一页/a "
4 x+ j1 j- f# n' N$ Gresponse.write "a href="request.servervariables("document_name")"?page="(page-1)"上一页/a "
# G* m3 { s: C7 M# F- ^2 s9 u
end if
2 @ |& z, x4 z4 x) a% g" b( Z
if pagers.pagecount then
- O5 Z( w9 b( N7 c5 O- J# B8 v
response.write "a href="request.servervariables("document_name")"?page="(page 1)"下一页/a "
$ S/ S! ~/ f) z" s- J# @8 m! F
response.write "a href="request.servervariables("document_name")"?page="rs.pagecount"最后一页/a "
6 H+ c$ u3 {9 D$ ~$ Q! V9 O( Q, _end if
5 O7 m2 ?5 g) H6 M& \ F; ^! d. P) rresponse.write"页码:"page"/"rs.pagecount
* I: f$ N H. g( H d& Q* X4 ?# m
'关闭对象,释放内存
% f$ j. R) @7 T* P
rs.close
8 I5 }6 Y3 u0 Eset rs=nothing
) w D; x' [) b; d, K- mconn.close
/ ~# \2 |! Y, [& O! ?" |! g
set conn=nothing
2 q* L, L [: q8 b1 B7 g6 _( ?%
* P+ }; C% l( Y; D: b+ v3 I
% ^4 U Z2 N4 I$ z思考:分页过程中使用了哪些额外的属性?