第 4章 在 ASP中使用 VBScript
本章要点,
l Vbscript的常量、变量
l Vbscript的控制转移和循环
l Vbscript中的过程
l Vbscript的浏览器及 Err对象
l VBScript事件处理和错误调试技

4.1 脚本语言
?4.1.1 什么是脚本语言
脚本语言是介于 HTML和 Java,C++
和 Visual Basic之类的编程语言之间的语
言。 HTML通常用于格式化文本和链接
网页。编程语言通常用于向计算机发送
一系列复杂指令。脚本语言也可用来向
计算机发送指令,但它们的语法和规则
没有可编译的编程语言那样严格和复杂。
脚本语言主要用于格式化文本和使用以
编程语言编写的已编译好的组件。
ASP使网站开发人员用多种脚本语言
编写完整的过程成为可能。事实上,在
单个,asp 文件内部就可以使用多种脚本
语言。另外,由于脚本是在服务器端读
取和处理的,所以请求,asp 文件的客户
端浏览器并不需要支持脚本。
在服务器端使用脚本语言,需要在
服务器端安装脚本引擎。脚本引擎是用
于处理脚本的 COM( 组件对象模型)对象,
通俗地讲就是用某种语言书写的命令的
程序。 ASP为脚本引擎提供主机环境并
把,asp文件中的脚本交给脚本引擎处理。
对于,asp文件中使用的每种脚本语言,都
要将它们相应的脚本引擎安装在 Web服
务器上。
ASP带有两个脚本引擎,Microsoft
Visual Basic Scripting Edition (VBScript)
和 Microsoft JScript。 缺省语言是 VBScript,
当安装完 Active Server Pages时,它就已
存在了。同时安装的还有 JScript。 当然也
可以安装和使用其它的脚本语言引擎,
例如 Perl。
?4.1.2 VBScript和 JScript之间的区别
VBScript和 JScript之间最大的区别就
是它们的结构。 VBScript是 Visual Basic
的子集,如果你曾经用过 Visual Basic或
者是 Visual Basic for Applications(VBA),
就会觉得非常熟悉。不过它们并不是完
全一样的,因为 VBScript是特意为在浏览
器中进行工作而设计的,它不包括一些
在脚本这个范围以外的特性,如文件访
问和打印等等。
而另一方面,JScript是从一组编程
语言如 C,C++,以及 Java等之中脱离
出来的。如果你以前曾经用过 C或者是
Java,那么 JScript的结构你会觉得非常熟
悉。即便你不知道这些语言也没有关系,
JScript的结构一点也不难,它就像 C和
Java一样方便,而没有它们那么复杂,
但是,JScript和 Java是完全不同的两种语
言。 Java是一种对于网页应用程序和非网
页应用程序都可以使用的完全成熟的开
发语言。而 JScript是一种主要用于脚本编
写的脚本语言。
JScript和 VBScript的任务是相同的 ——都
是用来编写 Web网页的 。 每种语言都支
持一些别的语言不支持的特性, 不过,
这些差异还不足以自动划分两种语言的
使用范围 。
选择脚本语言很多因素, 比如:将要使
用的平台能否支持所使用的语言? 所编
写的或要编写的是客户端应用还是服务
器端应用? 如果是服务器端的, 用户会
使用什么浏览器和服务器软件?
1.什么时候选择 VBScript
BScript主要是用在微软公司的各种平台
上。因此如果想用 VBScript来进行编写,
就必须要使用下列脚本之一,
服务器脚本。如果要用 VBScript来编写
服务器脚本(如在 ASP网页中),这个服
务器必须是 IIS,或者是其它服务器。
客户端脚本。如果想在浏览器脚本中用
到 VBScript,这个浏览器必须是 IE。 因为
其它流行的浏览器可能不支持 VBScript。
如果使用的是 Visual InterDev,那么就
应该使用 IIS( 或是其它相同的服务器),
因而用 VBScript来编写服务器脚本不是问
题。如果使用的不是 IIS,就要搞清楚该
服务器是不是能够支持 VBScript。
然而,如果要建立的是一个公共 Web点,
就无法控制其他人使用的浏览器,那么 IE
只能用于客户端脚本这个限制就成问题了。
不过,如果在浏览器已知的情况下用
VBScript编写客户端脚本,这还是可行的。
如果目标平台能够支持 VBScript,考虑
一下下列因素再决定是否用 VBScript来编
写脚本,
错误控制。在 VBScrip中有 On Error
Resume Next来对特殊情况给出说明。如
果编写的是服务器脚本,错误控制是非
常重要的,因为脚本的运行是无人照顾
的。
格式化。 VBScript有这样的功能,能够
轻松的把数据,数字和货币数据格式化。
在 IE中事件控制很方便,就像在 Visual
Basic中一样。在 VBScript中也能够建立
一个隐含的事件处理程序,这只需要用
对象-事件结构形式来定义一项功能就
行了,比如说 Button_onclick。 不过在 IE
中,JScript没有这项功能(但在其它的
JScript主机上支持这项功能)。
2,什么时候选择 Jscript
几乎所有允许编写脚本的浏览器都支持
JScript。 因此, 如果为一个公共 Web站点
编写一个应用程序, 用 JScript来编写客户
端脚本是很自然的选择 。
此外,因为 Jscrip应用得如此广泛(还有
与它类似的 JavaScript),是一种标准的
脚本语言,可以在网上找到很多有关的
资源。
如果想用 JScript 来编写服务器脚本,那
么应该检查一下的服务器是否支持它。
微软公司的 IIS允许你用 JScript 来编写
ASP网页的脚本,但这并不是所有的服
务器都支持的。
影响到你做决定的其它因素还有,
动态执行。 JScript 一个非常有力的特性
是:它允许在你的脚本内建立和执行脚
本或者动态进行评价。简而言之,就是
在你的脚本中能够编写脚本。当你用
DHTML进行工作时,这个特性是非常有
用的,因为这样就能够动态地操作
DHTML 的文档模型了。
面向对象。 JScript使用的是一种基于原
型的对象结构,它能够允许你在脚本中
定义对象。也可以往对象的原型中加入
方法和特性,扩展内置对象和定制对象。
使用 JScript时需要特别注意,JScript是区
分大小写的。
初学 JScript,应该知道如何用 JScript建立
事件处理程序。在 IE中,JScript会要求你
链接一个对象上,而这个对象又是与事
件处理程序相连的。通常,只要在鉴别
事件并且有处理程序功能的对象的标签
栏中指明其属性就能够完成。
在其它的主机上,可以使用隐含的事件
绑定,不过它要求的结构与 VBScript中稍
有不同。在 JScript中约定的隐含处理程序
是,
<SCRIPT LANGUAGE="JavaScript">
function btnsave::onclick()
{
// script here
}
</SCRIPT>
值得注意的是,在上面程序中
LANGUAGE这项属性是设置为
,JavaScript”的。 IE对于, Jscript”和
,JavaScript”这两个名字都认识,而许多
其它的浏览器却只认识, JavaScript”,不
认识, Jscript”。 因此,为了保险起见,
最好用, JavaScript”。
3.区分大小写
JScript能够区分大写和小写:在每个
JScript的关键字,还有 JScript姓名空间的
所有部分中,可以把大写和小写字母恰
当地结合起来使用。这其中包括了使用
的对象模型中所有的关键字。例如,在
使用 ASP Response对象时,必须正确地
使用大写或小写字母(如
Response.Write),否则 JScript会不予承
认。同样地,在为 DHTML onclick事件编
写一个处理程序时,如果用在 Visual
Basic中经常使用的形式,JScript可能就
不会承认。
VBScript当然是不区分大写和小写字
母的。例如,使用 Request或 request都可
以引用 ASP Request对象。因为不区分大
小写,所以无法通过大小写来区分变量
名。例如,无法创建两个单独的变量
Color和 color。 在某种程度上,这种不计
较大小写的忽视甚至在你用 VBScript对
JScript编写的单元进行访问时都适用。下
面给出了两个脚本,第一个是用 JScript编
写的,它是一个按钮处理程序,能够调
用 JScript函数,并且报告全局变量的值
<SCRIPT LANGUAGE=JavaScript>
var ctr;function doubleMe (aNumber)
{ // Initialize value of global counter
if (parseInt(ctr)){
ctr=ctr+1;}
else {
ctr=1;
}
return aNumber * 2;
}
</SCRIPT>
<SCRIPT LANGUAGE=vbScript>
Function btn1_onclick()
NumberToDouble=12
alert("The doubled number = " & DoubleMe
(numberToDouble))
alert("You have doubled the number " & Ctr
& " times.")
end function
</SCRIPT>
在 VBScript脚本中,doubleMe 函数和 ctr
变量,没有正确使用字母的大小写,但
是程序依然运行良好。
但在下面这些情况下一定要注意字母的
大小写,
如果网页中的 JScript脚本所包含的单元
只能够通过字母的大写和小写来区分,
例如,一个叫做 Timer()的函数和一个叫
做 timer的全局变量等等。记住,尽管这
种编码方式不怎么好,但是有时候在网
页中还是可能会遇到原来就存在的编码。
?4.1.3 在同一个网页中同时使用几种语言
在同一个网页中可以使用不同的脚本编
写语言,其原因是,
( 1)只是想在一个程序中利用某种语言
的优点,而脚本的其它部分还是用另外
一种语言来编写。
( 2)所面对的现有的编码是用不熟悉的
语言来编写的。例如,设计时间控制是
用 JScript编写的,而熟悉的语言却是
VBScript。
在大部分情况下, 可以在同一个网页中
混合几种脚本语言并且它们相互之间能
够配合得很好 。 用一种语言编写的脚本
可以调用用另一种语言编写的程序并且
能够共享全局变量 。
从 VBScript中调用一个 JScript函数时, 注
意在调用过程中要有括号, 即使这项函
数不要求设置参数也需如此 。 例如, 一
个调用应该像这样,
retVal = callJSFunction()
如果忘了加括号,那么这个函数所返回
的值就不是所希望的值,而是一个包含
了函数本身的目标。
1.服务器脚本的执行顺序
内联服务器脚本(在 <% %>分隔符中的
脚本)按顺序运行,从头到尾。可以在
一个服务器脚本中定义一个可调用的程
序(函数或者是子程序),这样,如果
需要就可以随时调用它们。
所有的内联脚本必须用一种语言来编写,
也就是在网页前面的 @指示中所指明的
脚本语言。因此,在一个内联脚本中不
能把几种脚本语言混合起来。
在理论上,把内联脚本放到 <SCRIPT>单
元中是绝对可能的,只要在单元中的脚
本不是一个函数或者一个子程序就可以
了。如,
< % Response.Write(Some inline
script<BR>")%>
<SCRIPT LANGUAGE = " VBScript"
RUNAT = "Server">
Response.Write("Script in a SCRIPT
element<BR>")
</SCRIPT>
虽然可以这么做,但是这样就会被 ASP处
理程序的执行顺序控制。例如,如果建
立了服务器脚本并且在 IIS 4.0 中运行它,
会发现执行顺序是这样的,
( 1) 用非默认语言的 <SCRIPT>单元脚
本 。
( 2) 内联脚本 。
( 3) 采用默认语言的 <SCRIPT>单元脚本 。
以上的顺序在很大程度上依赖于 ActiveX
语言引擎的载入顺序, 同时 IIS中的 ASP
处理程序可以在将来会有所改变, 因此,
不希望按照这个顺序进行工作, 不管是
只把 <SCRIPT>单元用于函数或者子程序,
还是把它仅仅用于执行顺序无关紧要的
编码 。
2.脚本块的顺序
在把几种语言混合使用时,<SCRIPT>块
在网页中出现的顺序非常重要,有时候
会影响到它们是否能正常工作。看看下
面这个简单的例子,它是在一个内联的
VBScript脚本中调用一个用 JScript编写的
函数,
<SCRIPT LANGUAGE = "VBScript">
?调用一个 Jscript函数
aNumber =2
doubledNumber = doubleMe(aNumber)
document.write("答案," & doubledNumber)
</SCRIPT>
<SCRIPT LANGUAGE = "JavaScript">
function doubleMe (aNumber)
{
return aNumber * 2;
}
</SCRIPT>
它不会起任何作用。说得更明白一点就
是,文档写入说明会往网页中写入一个
空的字符串。因为,在处理 VBScript块时,
后面的 JScript<SCRIPT>块没有被读出来,
没有进行语法分析,因此网页不能使用
它。而当浏览器处理网页中的脚本块时,
它是从上往下进行的。
在这个例子中,只需要调换一下脚本块
的顺序就能够解决这个问题了。事实上,
这类问题并不那么常见,在大多数情况
下,<SCRIPT>中包含的函数和子程序只
有当整个网页被全部下载下来并且所有
的单元都可以使用之后才能够被调用。
不过要记住,网页是按照一定的顺序来
处理的,不同语言的 <SCRIPT>块是分别
处理的。
VBScript 和 JScript都不是一成不变的语
言。两种语言的引擎都定时进行更新,
增加一些新的特性,解决已经发现的问
题。因为两种语言实际上都是作为
ActiveX组件来应用的,所以每当更新任
何控制器时,就可以同时更新它们。在
安装了新的语言引擎之后,
任何需要调用引擎的应用程序会在它们
运行某些脚本时调用这个新引擎 ——这
些引擎包括 IE或 Visual InterDev等。
?4.1.4 设置主脚本语言
ASP主脚本语言是用来处理在分界符
<% 和 %> 内部的命令的语言。默认时,
主脚本语言是 VBScript,当然可以将任何
一种具有脚本引擎的脚本语言作为主脚
本语言,也可以逐页设置主脚本语言,
或在 ASP应用程序中设置所有页的主脚
本语言。
1.为某页设置语言
要设置单个页的主脚本语言,可将 <%@
LANGUAGE %>指令添加到,asp文件的开
头。该指令的语法是,
<%@ LANGUAGE=Scripting Language %>
其中 Scripting Language就是所要设置的
页的主脚本语言。如果对某页进行了设
置,那么该页将忽略在应用程序中对所
有页的全局设置。
2.为应用程序设置语言
在应用程序中,如要为所有页设置主脚
本语言,可在 Internet服务管理器的, 应
用程序选项, 选项卡上设置, 默认的
ASP语言, 属性。
3.在服务器上使用 VBScript和 JScript
在服务端通过 ASP使用 VBScript时,由于
ASP脚本是在服务器端执行的,两个
VBScript特征将失效,即表示用户接口的
元素的 VBScript语句 InputBox和 MsgBox
将不被支持。另外,在服务器端的脚本
中,请不要使用 VBScript函数
CreateObject和 GetObject,而要使用
Server.CreateObject,这样 ASP就可以跟
踪对象实例了。用 CreateObject或
GetObject创建的对象不能访问 ASP内建
对象,也不能参与事务处理。该规则的
一个例外是如果使用的是 Admin对象和
Java monikers。 详细信息,请参阅 IIS
Admin 对象和创建 Java 类的实例。
4.2 VBScript基础
在开始学习脚本语言之前,首先理
解一些简单的概念 ——变量、进程。变
量是计算机内存中已命名的存储位置,
其中包括了数字或字符串等数据,它使
用户便于理解脚本操作的名称,为用户
提供了一种存储、检索和操作数据的途
径。程序是由一个或多个进程组成的。
在 VBScript中,进程就是, 指令块,,只
是为了简单的数据处理。
?4.2.1 VBScript 数据类型
VBScript只有一种数据类型,称为
Variant。 Variant是一种特殊的数据类
型,根据使用的方式,它可以包含不同
类别的信息。因为 Variant是唯一的数据
类型,所以它也是 VBScript中所有函数
的返回值的数据类型。
最简单的 Variant可以包含数字或字
符串信息。 Variant用于数字上下文中时
作为数字处理,用于字符串上下文中时
作为字符串处理。
这就是说, 如果使用看起来象是数字的
数据, 则 VBScript会假定其为数字并以适
用于数字的方式处理 。 与此类似, 如果
使用的数据只可能是字符串, 则 VBScript
将按字符串处理 。 当然, 也可以将数字
包含在引号 (,” )中使其成为字符串 。
除简单数字或字符串以外, Variant可以
进一步区分数值信息的特定含义 。 例如
使用数值信息表示日期或时间 。 此类数
据在与其它日期或时间数据一起使用时,
结果也总是表示为日期或时间 。
当然,从布尔值到浮点数,数值信息是
多种多样的。 Variant包含的数值信息类
型称为子类型。大多数情况下,可将所
需的数据放进 Variant中,而 Variant也会
按照最适用于其包含的数据的方式进行
操作。表 4-1显示了 Variant包含的数据子
类型。
表 4-1 Variant子类型
子类型 描 述
Empty 未初始化的 Variant。 对于数值变量,值
为 0;对于字符串变量,值为零长度字
符串 ("")。
Null 不包含任何有效数据的 Variant
Boolean 包含 True或 False
Byte 包含 0到 255之间的整数
Integer 包含 -32,768到 32,767之间的整数
Currency -922,337,203,685,477.5808 到
922,337,203,685,477.5807
子类型 描 述
Long 包含 -2,147,483,648 到 2,147,483,647 之间
的整数
Single 包含单精度浮点数,负数范围从 -
3.402823E38 到 -1.401298E-45,正数范围
从 1.401298E-45 到 3.402823E38
Double 包含双精度浮点数,负数范围从 -
1.79769313486232E308到 -
4.94065645841247E-324,正数范围从
4.94065645841247E-324到
1.79769313486232E308
子类型 描 述
Date (time)
包含表示日期的数字,日期范围从
公元 100年 1月 1日到公元 9999年 12
月 31日。
String 包含变长字符串,最大长度可为 20
亿个字符
Object 包含对象
Error 包含错误号
可以使用转换函数来转换数据的子类型,
用 VarType函数返回数据的 Variant子类型。
?4.2.2 变量
1.声明变量
声明一个变量意味着告诉脚本引擎,有
一个特定的变量,这样就可以在脚本中
引用该变量。在 VBScript中声明一个变量
可以使用 Dim语句,Public语句和 Private
语句。
( 1) Dim语句
Dim语句用来明确地声明变量。与 Visual
Basic不同的是,它无需指明变量的数据
类型。因为 VBScript中,只用一种数据类
型。
格式,
Dim 变量名称
例如,
Dim DegreesFahrenheit
声明多个变量时, 使用逗号分隔变量 。 例
如,
Dim Top,Bottom,Left,Right
( 2) Redim语句
Redim语句是专用来定义数组的。当需要根
据数据的增加和删除来扩大或缩小数组
的大小时,可通过 Redim语句来实现。
下面是一个扩大数组的简单格式,
Dim datanum

'程序代码
Redim Preserve datanum(20)
Redim Preserve datanum(20)语句将数组的
元素扩大到 20。
默认的情况下, 使用 Redim语句的同时会清
除数组中的所有值 。 而使用 Preserve 关键
字可以将所有现存的数据保存下来, 并
添加新的空白单元;
如果缩小了数组的大小,那么被减去的单元中
的数据也会丢失。
3) Public关键字
Public关键字用于定义全局型变量 。
格式,
Public 变量名称
例如,
Public a,b
和 Dim语句一样,Public可以声明变量,并可以
一次声明多个变量,也可以声明一维或多维数
组。所不同的是 Public关键字定义的变量是全
局变量。
( 4) Private关键字
Private关键字可以定义变量, 一次定义多
个变量, 定义一维或多维数组, 不同的
只是变量的作用范围不同 。 下面列出了
使用上面语句或关键字定义的变量的可
能作用范围,
l Dim,整个脚本程序或过程, 函数
中 。
l Redim,整个脚本程序或过程, 函数
中 。
l Public,整个脚本程序 。
l Private,过程或函数中。
( 5) Option Explicit语句
虽然可以不声明变量而直接使用,
但是,这通常不是一个好习惯,因为这
样有时会由于变量名被拼错而导致在运
行脚本时出现意外的结果。因此,最好
使用 Option Explicit语句显式声明所有
变量,并将其作为脚本的第一条语句。
这样,如果以后拼写错变量名,VBScript
就会提醒你这个变量没有声明,而避免
出现由于拼写错误所造成的问题。
2,命名规则
变量命名必须遵循 VBScript的标准命名规
则 。 变量命名必须遵循,
l 第一个字符必须是字母 。
l 不能包含嵌入的句点 。
l 长度不能超过 255个字符 。
l 在被声明的作用域内必须唯一 。
变量的作用域与存活期。
3,变量的作用域及存活期
变量的作用域由声明它的位置决定 。 如
果在过程中声明变量, 则只有该过程中
的代码可以访问或更改变量值, 此时变
量具有局部 作用域 并被称为 过程级 变量 。
如果在过程之外声明变量, 则该变量可
以被脚本中所有过程所识别, 称为脚本
级 变量, 具有脚本级作用域 。
变量存在的时间称为存活期 。 脚本级变
量的存活期从被声明的一刻起, 直到脚
本运行结束 。 对于过程级变量,
其存活期仅是该过程运行的时间,该过
程结束后,变量随之消失。在执行过程
时,局部变量是理想的临时存储空间。
可以在不同过程中使用同名的局部变量,
这是因为每个局部变量只被声明它的过
程识别。
4,给变量赋值
给变量赋值很简单, 创建如下形式的表
达式给变量赋值,变量在表达式左边,
要赋的值在表达式右边 。 例如,
B = 200
5,标量变量和数组变量
多数情况下, 只需为声明的变量赋一个
值 。 只包含一个值的变量被称为标量变
量 。 有时候, 将多个相关值赋给一个变
量更为方便, 因此可以创建包含一系列
值的变量, 称为数组变量 。 数组变量和
标量变量是以相同的方式声明的, 唯一
的区别是声明数组变量时变量名后面带
有括号 ( ) 。 下例声明了一个包含 11个
元素的一维数组,
Dim A(10)
虽然括号中显示的数字是 10,但由于在
VBScript中所有 数组 都是基于 0 的,所以
这个数组实际上包含 11个元素。在基于 0
的数组中,数组元素的数目总是括号中
显示的数目加 1。这种数组被称为固定大
小的数组。
在数组中使用索引为数组的每个元素赋
值 。 从 0到 10,将数据赋给数组的元素,
如,
A(0) = 256
A(1) = 324
A(2) = 100

A(10) = 55
与此类似, 使用索引可以检索到所需的数
组元素的数据 。 如,

SomeVariable = A(8)

数组并不仅限于一维。数组的维数最大
可以为 60(尽管大多数人不能理解超过 3
或 4的维数)。声明多维数组时用逗号分
隔括号中每个表示数组大小的数字。在
下例中,MyTable 变量是一个有 6行和 11
列的二维数组,
Dim MyTable(5,10)
在二维数组中,括号中第一个数字表
示行的数目,第二个数字表示列的数目。
也可以声明动态数组, 即在运行脚本时
大小发生变化的数组 。 对数组的最初声
明使用 Dim语句或 ReDim语句 。 但是对于
动态数组, 括号中不包含任何数字 。 如,
Dim MyArray()
ReDim AnotherArray()
要使用动态数组,必须随后使用 Redim确
定维数和每一维的大小。在下例中,
Redim将动态数组的初始大小设置为 25,
而后面的 Redim语句将数组的大小重新调
整为 30,同时使用 Preserve关键字在重新
调整大小时保留数组的内容,
Redim MyArray(25)

Redim Preserve MyArray(30)
重新调整动态数组大小的次数是没有任
何限制的。但是应注意:将数组的大小
调小时,将会丢失被删除元素的数据。
? 4.2.3 常量
常 量 是具有一定含义的名称, 用于代
替数字或字符串, 其值从不改变 。
使用 Const语句在 VBScript中创建用
户自定义常数或创建名称具有一定含义
的字符串型或数值型常数, 并给它们赋
原义值 。 例如,
Const MyString = "这是一个字符串 。 "
Const MyAge = 49
请注意字符串文字包含在两个引号 ("")之
间, 这是区分字符串型常数和数值型常
数的最明显的方法 。 日期文字和时间文
字包含在两个 #之间 。 例如,
Const CutoffDate = #6-1-97#
最好采用统一的命名方案以区分常数和
变量 。 这样可以避免在运行脚本时对常
数重新赋值 。 例如, 可以使用, vb”或
,con”作常数名的前缀, 或将常数名的
所有字母大写 。 将常数和变量区分开可
以在开发复杂的脚本时避免混乱 。
在 VBScript中已经定义了许多固有常量,
可以直接引用。
1,Empty常量
Empty常量表示一个为初始化的变量。如
果定义了一个变量,没有对它赋值,那
么这个变量就是 Empty。
2,Null常量
Null常量表示一个变量包含无效的数值 。
注意, Empty和 Null是不一样的,
当在一个表达式中使用值为 Empty的变量
时, 如果它被用作数字, 则它等于 0;如
果它被用作字符串, 那么它就等于 0长度
字符串 。
Null则不同, 它表示变量中没有包含有
效数据 。
3,Nothing常量
Nothing用于断开对象变量和任何实际对
象之间的链接, 使用 SET语句可将一个对
象变量设置为 Nothing,如,
Set 对象变量名= Nothing
通过把一个对象变量赋值为 Nothing,表
明已经使用完了变量所链接的对象, 可
以释放该对象所占用的内存以及分配给
该对象的其它系统资源 。
如果有多个变量同时链接到一个对象,
VBScript直到指向该对象的所有变量都设
置为 Nothing时, 才会释放该对象资源 。
运算时, 总是先执行括号中的运算符,
然后再执行括号外的运算符 。 但是, 在
括号中仍遵循标准运算符优先级 。
当表达式包含多种运算符时, 首先计算
算术运算符, 然后计算比较运算符, 最
后计算逻辑运算符 。 所有比较运算符的
优先级相同, 即按照从左到右的顺序计
算比较运算符 。
当乘号与除号同时出现在一个表达式中
时, 按从左到右的顺序计算乘, 除运算
符 。 同样当加与减同时出现在一个表达
式中时, 按从左到右的顺序计算加, 减
运算符 。
字符串连接运算符 &不是算术运算符,
但是在优先级顺序中,它排在所有算术
运算符之后和所有比较运算符之前。 Is运
算符是对象引用比较运算符。它并不比
较对象或对象的值,而只是进行检查,
判断两个对象是否引用同一个对象。
4.3 VBScript中的条件语句
使用条件语句和循环语句可以控制
脚本的流程 。 编写进行判断和重复操作
的 VBScript代码, 在 VBScript中可使用以
下条件语句,
If… Then… Else 语句
Select Case 语句
?4.3.1 If…Then…Else 语句
If… Then… Else 语句用于计算条件是否
为 True 或 False,并且根据计算结果指
定要运行的语句 。 通常, 条件是使用比
较运算符对值或变量进行比较的表达式 。
If… Then… Else 语句可以按照需要进行
嵌套 。
要在条件为 True 时运行单行语句,可
使用 If…Then…Else 语句的单行语法。
如,
Sub FixDate()
Dim myDate
myDate = #2/13/95#
If myDate < Now Then myDate = Now
End Sub
请注意此例省略了关键字 Else。
要运行多行代码,必须使用多行(或块)
语法。多行(或块)语法包含有 End If 语
句,不能省略。如,
Sub AlertUser(value)
If value = 0 Then
AlertLabel.ForeColor = vbRed
AlertLabel.Font.Bold = True
AlertLabel.Font.Italic = True
End If
End Sub
另一方面, 也可以使用 If… Then… Else
语句定义两个可执行语句块:条件为
True 时运行某一语句块, 条件为 False 时
运行另一语句块 。 如,
Sub AlertUser(value)
If value = 0 Then
AlertLabel.ForeColor = vbRed
AlertLabel.Font.Bold = True
AlertLabel.Font.Italic = True
Else
AlertLabel.Forecolor = vbBlack
AlertLabel.Font.Bold = False
AlertLabel.Font.Italic = False
End If
End Sub
4,True和 False常量
True的值为 -1; False的值为 0。
?4.2.4 VBScript 运算符
VBScript 有一套完整的运算符, 包括 算
术运算符, 比较运算符, 连接运算符 和
逻辑运算符 。
当表达式包含多个运算符时, 将按预定
顺序计算每一部分, 这个顺序被称为运
算符优先级 。 可以使用括号越过这种优
先级顺序, 强制首先计算表达式的某些
部分 。
运算时, 总是先执行括号中的运算符,
然后再执行括号外的运算符 。 但是, 在
括号中仍遵循标准运算符优先级 。
当表达式包含多种运算符时,首先
计算算术运算符,然后计算比较运算符,
最后计算逻辑运算符。所有比较运算符
的优先级相同,即按照从左到右的顺序
计算比较运算符。
当乘号与除号同时出现在一个表达
式中时, 按从左到右的顺序计算乘, 除
运算符 。 同样当加与减同时出现在一个
表达式中时, 按从左到右的顺序计算加,
减运算符 。
字符串连接运算符 &不是算术运算符,
但是在优先级顺序中,它排在所有算术
运算符之后和所有比较运算符之前。 Is运
算符是对象引用比较运算符。它并不比
较对象或对象的值,而只是进行检查,
判断两个对象是否引用同一个对象。
4.3 VBScript中的条件语句
使用条件语句和循环语句可以控制脚本
的流程 。 编写进行判断和重复操作的
VBScript代码, 在 VBScript中可使用以下
条件语句,
If… Then… Else 语句
Select Case 语句
?4.3.1 If…Then…Else 语句
If…Then…Else 语句用于计算条件是否
为 True 或 False,并且根据计算结果指定
要运行的语句。通常,条件是使用比较
运算符对值或变量进行比较的表达式。
If…Then…Else 语句可以按照需要进行嵌
套。
要在条件为 True 时运行单行语句,可使
用 If…Then…Else 语句的单行语法。如,
Sub FixDate()
Dim myDate
myDate = #2/13/95#
If myDate < Now Then myDate = Now
End Sub
请注意此例省略了关键字 Else。
要运行多行代码, 必须使用多行 ( 或块 )
语法 。 多行 ( 或块 ) 语法包含有 End If 语
句, 不能省略 。 如,
Sub AlertUser(value)
If value = 0 Then
AlertLabel.ForeColor = vbRed
AlertLabel.Font.Bold = True
AlertLabel.Font.Italic = True
End If
End Sub
另一方面,也可以使用
If…Then…Else 语句定义两个可执行语句
块:条件为 True 时运行某一语句块,条
件为 False 时运行另一语句块。如,
Sub AlertUser(value)
If value = 0 Then
AlertLabel.ForeColor = vbRed
AlertLabel.Font.Bold = True
AlertLabel.Font.Italic = True
Else
AlertLabel.Forecolor = vbBlack
AlertLabel.Font.Bold = False
AlertLabel.Font.Italic = False
End If
End Sub
If… Then… Else语句的一种变形是可以从
多个条件中选择, 即添加 ElseIf子句以扩
充 If… Then… Else语句的功能, 控制基
于多种可能的程序流程 。 如,
Sub ReportValue(value)
If value = 0 Then
MsgBox value
ElseIf value = 1 Then
MsgBox value
ElseIf value = 2 Then
Msgbox value
Else
Msgbox "数值超出范围 ! "
End If
End Sub
可以添加任意多个 ElseIf子句以提供多种选
择。然而,使用多个 ElseIf子句会使程序
变得难懂。因此,在多个条件中进行选
择的更好方法是使用 Select Case语句。
?4.3.2 使用 Select Case进行判断
Select Case 结构提供了 If…Then…ElseIf
结构的一个变通形式,可以从多个语句
块中选择执行其中的一个。 Select Case语
句提供的功能与 If…Then…Else 语句类似,
但是可以使代码更加简练易读。
Select Case 结构在其开始处使用一个只
计算一次的简单测试表达式。表达式的
结果将与结构中每个 Case的值比较。如
果匹配,则执行与该 Case关联的语句块。
如,
Select Case
Document.Form1.CardType.Options(Sel
ectedIndex).Text
Case "MasterCard"
DisplayMCLogo
ValidateMCAccount
Case "Visa"
DisplayVisaLogo
ValidateVisaAccount
Case Else
DisplayUnknownImage
PromptAgain
End Select
请注意 Select Case结构只计算开始处的一
个表达式 ( 只 计 算 一 次 ), 而
If… Then… ElseIf结构计算每个 ElseIf语句
的表达式, 这些表达式可以各不相同 。
因此, 仅当每个 ElseIf语句计算的表达式
都相同时, 才可以使用 Select Case结构代
替 If… Then… ElseIf 结构 。
4.4 VBScript中的循环语句
?4.4.1 使用循环重复执行代码
循环用于重复执行一组语句 。 循环可分
为三类:一类在条件变为 False 之前重
复执行语句;一类在条件变为 True 之前
重复执行语句;另一类按照指定的次数
重复执行语句 。
在 VBScript 中可使用下列循环语句,
( 1) Do… Loop,当 ( 或直到 ) 条件为
True 时循环 。
( 2) While… Wend,当条件为 True 时循环 。
( 3) For… Next,指定循环次数, 使用计
数器重复运行语句 。
( 4) For Each… Next,对于集合中的每项
或数组中的每个元素, 重复执行一组语
句 。
1,使用 Do… Loop循环
可以使用 Do… Loop语句多次 ( 次数不定 )
运行语句块 。 当条件为 True时或条件变
为 True之前, 重复执行语句块 。
( 1) 当条件为 True时重复执行语句
While关键字用于检查 Do… Loop语句
中的条件 。 有两种方式检查条件:在进
入 循 环 之 前 检 查 条 件 ( 如 下 面 的
ChkFirstWhile示例 ) ;或者在循环至少
运行完一次之后检查条件 ( 如下面的
ChkLastWhile示例 ) 。 在 ChkFirstWhile
过程中, 如果 myNum的初始值被设置为
9而不是 20,则永远不会执行循环体中的
语句。在 ChkLastWhile过程中,循环体
中的语句只会执行一次,因为条件在检
查时已经为 False。
Sub ChkFirstWhile()
Dim counter,myNum
counter = 0
myNum = 20
Do While myNum > 10
myNum = myNum - 1
counter = counter + 1
Loop
MsgBox "循环重复了 " & counter & " 次 。
"
End Sub
Sub ChkLastWhile()
Dim counter,myNum
counter = 0
myNum = 9
Do
myNum = myNum - 1
counter = counter + 1
Loop While myNum > 10
MsgBox "循环重复了 " & counter & " 次 。
"
End Sub
( 2) 重复执行语句直到条件变为 True
Until 关键字用于检查 Do… Loop语句中的
条件 。 有两种方式检查条件:在进入循
环 之 前 检 查 条 件 ( 如 下 面 的
ChkFirstUntil 示例 ) ;或者在循环至少
运行完一次之后检查条件 ( 如下面的
ChkLastUntil 示例 ) 。 只要条件为 False,
就会进行循环 。
Sub ChkFirstUntil()
Dim counter,myNum
counter = 0
myNum = 20
Do Until myNum = 10
myNum = myNum - 1
counter = counter + 1
Loop
MsgBox "循环重复了 " & counter & " 次 。
"
End Sub
Sub ChkLastUntil()
Dim counter,myNum
counter = 0
myNum = 1
Do
myNum = myNum + 1
counter = counter + 1
Loop Until myNum = 10
MsgBox "循环重复了 " & counter & " 次 。
"
End Sub
( 3)退出循环
Exit Do语句用于退出 Do…Loop 循环。因
为通常只是在某些特殊情况下要退出循
环(例如要避免死循环),所以可在
If…Then…Else 语句的 True语句块中使用
Exit Do语句。如果条件为 False,循环将
照常运行。
在下面的示例中,myNum的初始值将导
致死循环。用 If… Then… Else语句检查
此条件,可防止出现死循环。
Sub ExitExample()
Dim counter,myNum
counter = 0
myNum = 9
Do Until myNum = 10
myNum = myNum - 1
counter = counter + 1
If myNum < 10 Then Exit Do
Loop
MsgBox "循环重复了 " & counter & "
次 。 "
End Sub
2.使用 While…Wend
While…Wend 语句是为那些熟悉其用法的
用户提供的。但是由于 While…Wend 缺
少灵活性,所以建议最好使用 Do…Loop
语句。
3,使用 For… Next
For… Next语句用于将语句块运行指定的
次数 。 在循环中使用计数器变量, 该变
量的值随每一次循环增加或减少 。
例如, 下面的示例将过程 MyProc重复执
行 50次 。
For语句指定计数器变量 x及其起始值与
终止值。 Next语句使计数器变量每次加 1。
Sub DoMyProc50Times()
Dim x
For x = 1 To 50
MyProc
Next
End Sub
关键字 Step用于指定计数器变量每次增
加或减少的值。在下面的示例中,计数
器变量 j每次加 2。循环结束后,total的
值为 2,4,6,8和 10的总和。
Sub TwosTotal()
Dim j,total
For j = 2 To 10 Step 2
total = total + j
Next
MsgBox "总和为 " & total & "。 "
End Sub
要使计数器变量递减,可将 Step设为负值。
此时计数器变量的终止值必须小于起始
值。在下面的示例中,计数器变量
myNum每次减 2。循环结束后,total的值
为 16,14,12,10,8,6,4和 2的总和。
Sub NewTotal()
Dim myNum,total
For myNum = 16 To 2 Step -2
total = total + myNum
Next
MsgBox "总和为 " & total & "。 "
End Sub
Exit For语句用于在计数器达到其终止值
之前退出 For…Next 语句。因为通常只是
在某些特殊情况下(例如在发生错误时)
要退出循环,
所以可以在 If…Then…Else 语句的 True 语
句块中使用 Exit For语句。如果条件为
False,循环将照常运行。
4.使用 For Each… Next
For Each…Next 循环与 For…Next 循环类
似。 For Each…Next 不是将语句运行指定
的次数,而是对于数组中的每个元素或
对象集合中的每一项重复一组语句。这
在不知道集合中元素的数目时非常有用。
在下例中,Dictionary对象的内容用
于将文本分别放置在多个文本框中,
程序见书 sample4-01.html
在 VBScript中,过程被分为两类:
Sub过程和 Function过程。
?4.5.1 Sub过程
Sub过程是包含在 Sub和 End Sub语句
之间的一组 VBScript 语句, 它只执行操
作不返回值 。 Sub过程可以使用参数 ( 由
调用过程传递的常数, 变量或表达式 ) 。
如果 Sub过程无任何参数, 则 Sub语句必
须包含空括号 ( ) 。
4.5 VBScript中的过程
下面的 Sub过程使用两个固有的(或内置
的) VBScript函数,即 MsgBox和 InputBox,
来提示用户输入信息。然后显示根据这
些信息计算的结果。计算由使用 VBScript
创建的 Function过程完成。
Sub ConvertTemp()
temp = InputBox(“请输入华氏温度 。
",1)
MsgBox "温度为 " & Celsius(temp)
& " 摄氏度 。 "
End Sub
?4.5.2 Function过程
Function过程是包含在 Function和 End
Function语句之间的一组 VBScript语句。
Function 过程与 Sub过程类似,但是
Function过程可以返回值。 Function过程
可以使用参数(由调用过程传递的常数、
变量或表达式)。如果 Function过程无任
何参数,则 Function语句必须包含空括号
()。 Function过程通过函数名返回一个
值,这个值是在过程的语句中赋给函数
名的。 Function返回值的数据类型总是
Variant。
在下面的示例中,Celsius函数将华氏度
换算为摄氏度。 Sub过程 ConvertTemp调
用此函数时,包含参数值的变量被传递
给函数。换算结果返回到调用过程并显
示在消息框中。
Sub ConvertTemp()
temp = InputBox("请输入华氏温度 。 ",
1)
MsgBox "温度为 " & Celsius(temp) & "
摄氏度 。 "
End Sub
Function Celsius(fDegrees)
Celsius = (fDegrees - 32) * 5 / 9
End Function
?4.5.3 过程的数据进出
给过程传递数据的途径是使用参数。
参数被作为要传递给过程的数据的占位
符。参数名可以是任何有效的变量名。
使用 Sub语句或 Function语句创建过程时,
过程名之后必须紧跟括号。括号中包含
所有参数,参数间用逗号分隔。
例如, 在下面的示例中, fDegrees是传递
给 Celsius函数的值的占位符,
Function Celsius(fDegrees)
Celsius = (fDegrees - 32) * 5 / 9
End Function
要从过程获取数据,必须使用
Function过程。请记住,Function过程可
以返回值; Sub 过程不返回值。
?4.5.4 在代码中使用 Sub和 Function过程
调用 Function过程时, 函数名必须用
在变量赋值语句的右端或表达式中 。 例
如,
Temp = Celsius(fDegrees) 或
MsgBox,温度为, & Celsius(fDegrees)
&, 摄氏度。,
调用 Sub过程时,只需输入过程名及
所有参数值,参数值之间使用逗号分隔。
可以不使用 Call语句,但如果使用了此
语句,则必须将所有参数包含在括号之
中。
下面的示例显示了调用 MyProc过程的
两种方式 。 一种使用 Call语句;另一种则
不使用 。 两种方式效果相同 。
Call MyProc(firstarg,secondarg)
MyProc firstarg,secondarg
请注意,当不使用 Call语句进行调用时,
括号被省略。
4.6 注释 Visual Basic脚本
注释可以提高代码的可读性,尤其
是在别人阅读你的程序代码时。可以在
ASP网页中使用 HTML风格的注释。但是,
在 Visual Basic脚本中不能用这种注释。
要在一个脚本中加人注释,必须用下面
的方法,
<!-HTML注释 -->
<%
REM 第一种 VBScript 注释方式
'第二种 VBScript 注释方式
%>
在这个例子中,REM语句用来建立一条注
释。注意一个撇号可以用于同样的目的。
REM语句与撇号( ‘ )执行同样的功能。
这两种注释只能用来注释一行。用
REM语句或撇号建立的注释在一行的末
尾结束。但是,可以把注释与其它 Visual
Basic语句写在同一行中,
<%
FOR i=1 TO 100 '循环开始
myvar=myvar+1 'myvar加 1
NEXT '循环结束
%>
HTML风格的注释与 VBScript注释的一个
重要区别是 VBScript注释不发送给浏览器,
不能用 Web浏览器中的查看源文件命令
来察看 VBScript注释。
4.7 VBScript中的函数
VBScript提供了很多功能强大的函数,为
用户编程提供了方便。同时,用户还可
以根据需要自定义一些函数。本节介绍
一些常用的函数。
?4.7.1 日期和时间函数
VBScript有许多函数,可以得到各种格式
的日期和时间。例如可以用函数 NOW返
回当前的日期和时间,
现在的时间是 <%=NOW%>
应该注意, 返回的日期和时间是 Web服
务器的系统时钟的日期和时间 。 如果身
处纽约的某个人在看你的网页, 他所看
到的日期和时间与他当地的日期和时间
可能是不一致的 。
函数 NOW同时返回日期和时间 。 如果只
想返回当前日期, 可以使用函数 DATE。
如果只想返回当前时间, 可以使用函数
TIME。 例如,
日期,<%=DATE%>
时间,<%=TIME%>
1.日期的操作
使用函数 MONTH(),DAY(),
WEEKDAY() 和 YEAR()。 可以把一
个日期分割成更小的部分。所有这些函
数都以一个日期表达式作为参数,并返
回一个数字。这里有一个如何使用这些
函数的例子,
本月是,<%=MONTH(DATE)%>
<BR>
今天是,<%=DAY(DATE)%>
<BR>
星期是,<%=WEEKDAY(DATE)%>
<BR>
今年是,<%=YEAR(DATE)%>
假设当前日期是 2003年 2月 12日,星期三。
如果把上面的例子包含在一个 ASP网页
中,在浏览器中将显示如下的文字,
本月是,2
今天是,12
星期是,3
今年是,2003
注意,函数 weekday()假定一个星期的第
一天是星期日。如果想把星期一作为一
周的第一天,可以使用如下的语句,
本周是,<%=weekday(DATE,vbWednesday)%>
也可以把任何一天作为一周的第一天。
要指定一周的第一天是星期几,只要用
vbSunday,vbMonday,vbTusday,
vbWednesday,vbThurday,vbFriday或
vbSaturday代替函数 WEEKDAY() 的第
二个参数即可。
不但可以用函数 DATE作为这些函数的参
数, 也可以提供一个日期字符串或者一
个日期常数作为参数, 如,
本周是,<%=WEEKDAY(#12/25/2002#)%>
本周是,<%=WEEKDAY("12-25-2002")%>
这两个函数都返回 2002年圣诞节这
一天是星期几 。 表达式 #12/25/2002#是一
个日期常数, 它总是括在字符#中 。 表
达式 "12-25-2002"是一个日期字符串 。 这
两种方法都可以为函数提供一个日期 。
要以更加易读的形式返回月份和星期几,
可以使用函数 WEEKDAYNAME( ) 或
MONTHNAME( ) 。 这两个函数返回的
是字符串 。 例如,
本月是,
<%=MONTHNAME(MONTH(DATE))%>
本周是,
<%=WEEKDAYNAME(WEEKDAY(DATE))%>
可以把 1到 12之间的任何整数作为函数
MONTHNAME() 的参数,把 1到 7之间
的任何整数作为函数 WEEKDAYNAME
() 的参数。
2.时间的操作
通过函数 HOUR(),MINUTE(),和
SECOND(),可以返回时间的不同部分。
下面是使用这些函数的一些例子以及可
能的返回值,
时,<%=HOUR(TIME)%>
时,18
分,<%=MINUTE(TIME)%>
分,39
秒,<%=SECOND(TIME)%>
秒,34
函数 HOUR()返回一个 0到 23之间的整数
( 0 点是午夜后的一个小时 ) 。 函数
MINUTE()返回一个 0到 59之间的整数 。
函数 SECOND()也返回一个 0到 59之间的
整数 。
不仅可以用函数 TIME作为这些函数的参
数, 还可以提供一个时间常数或时间字
符串作为参数 。 下面的两个例子都是从
时间中抽取分钟数 34,
分,<%=MINUTE(#12:34:19#)%>
分,34
分,<%=MINUTE("12:34:23")%>
分,34
3.日期和时间的比较
VBScript有两个用于比较日期和时间的
函数 。 可以用函数 DATEADD()对日期和
时间作加法, 用函数 DATEDIFF()计算两
个日期或时间的间隔 。 下面是使用函数
DATEADD()的例子,
你的账号将于
<%=DATEADD("ww",6,DATE)%>过期
你的账号将于 2003-4-27过期
上例返回比当前日期晚六个星期的日期 。
函数 DATEADD( ) 有三个参数,
第一个参数指定一个时间间隔 。 ( 见书
中表 4-3)
第二个参数时间间隔的倍数因子 。
第三个参数是一个日期或时间的变量或
常量 。
可以用函数 DATEDIFF来确定两个日
期或时间之间的间隔, 此函数在处理按
时间计费的系统时十分有用 。 如,
<%=DATEDIFF("d","1/1/2000",DATE)%>
<%=DATEDIFF("s",DATE,"1/1/2005")%>
第 一 句 中 的 DATEDIFF( ) 函 数 返 回
1/1/2000与当前日期之间的天数 。 第二句
中的 DATEDIFF( ), 返回当前日期到
2005年 1月 1日当前时刻之间的秒数 。
函数 DATEDIFF( ) 有三个参数 。 第一
个参数是一个日期或时间间隔;另两个
参数是两个日期 。
为了避免出现负数, 第一个日期参数应
该比第二个早 。
4.格式化日期和时间
可以规定一个日期或时间的显示格式 。
在缺省情况下, 当通过函数 DATE显示一
个日期时, 它看起来是这样的,
2/9/03 或 2/9/2003
至于显示哪种日期格式取决于控制面板
中区域设置的指定,前者为短格式,后
者为长格式
也可以用函数 FORMATDATETIME()
显示一个基于你计算机的区域设置的日
期。
下面的例子演示了如何控制长日期格
式和短日期格式的显示,
短日期格式,
<%=FORMATDATETIME(DATE,vbShortDate)%>
<br>
长日期格式,
<%=FORMATDATETIME(DATE,vbLongDate)%>
<br>
根据中国区域设置显示日期时, 日期
显示为如下的格式,
短日期格式,2003-2-16
长日期格式,2003年 2月 16日
注意短日期格式的显示与不做任何格式
化时完全相同 。 在缺省情况下, 日期以
短日期格式显示 。
也可以用函数 FORMATDATETIME()格
式化一个时间 。 同样, 可以指定一个时
间显示为长格式或短格式 。 当用短格式
显示时间时, 将使用 24小时时钟 ( 军事
时间 ) 。 下 面的例 子演示了 如何 用
FORMATDATETIME()函数操作时间,
短时间格式,
<%=FORMATDATETIME(TIME,vbShortTime)%><br>
长时间格式,
<%=FORMATDATETIME(TIME,vbLongTi
me)%><br>
当以中国区域设置显示时间时, 时间
的格式如下,
短时间格式,19:47
长时间格式,19:47:07
?4.7.2 数据转换函数
虽然在 VBScript中所有的变量都被
设置为 Variant类型, 都是在数学运算和
数据库存储操作时仍然会涉及到数据转
换的问题 。
1,CBool 函数
功能:把指定的参数转换为 Bool数据类型 。
格式,
CBool(表达式 )
表达式是任意有效的表达式 。
如果表达式是零,则返回 False; 否
则返回 True。 如果表达式不能解释为数
值,则将发生运行时错误。
2,CByte 函数
功能:把指定的参数转换为 Byte数据类型 。
语法,
CByte(表达式 )
表达式参数是任意有效的表达式 。
可以使用子类型转换函数书写代码,
以显示某些操作的结果应被表示为特定
的数据类型,而不是默认类型。例如,
在出现货币、单精度、双精度或整数运
算的情况下,使用 CByte 强制执行字节运
算。
CByte 函数用于进行从其它数据类型到 Byte
子类型的的国际公认的格式转换 。 例如对
十进制分隔符 ( 如千分符 ) 的识别, 可能
取决于系统的区域设置 。
如果表达式在 Byte子类型可接受的范围
之外, 则发生错误 。
3,CCur 函数
功能:把指定的参数转换为 Currency( 货币 )
数据类型 。
格式,
CCur(表达式 )
表达式参数是任意有效的表达式。值
的范围是从 -922,337,203,685,477.5808到
922,337,203,685,477.5807,并且 Currency
数据类型自能够处理小数点后四位小数。
可以使用子类型数据转换函数书写代
码,以显示某些操作的结果应当被表达
为特定的数据类型,而非默认的数据类
型。例如在整数运算的情况下,使用
CCur 函数强制进行货币计算。
CCur 函数用于进行从其它数据类型到
Currency 子类型的国际公认的格式转换。
例如,对十进制分隔符和千位分隔符的
识别取决于系统的区域设置。
4,CDate函数
功能:把指定的参数转换为 Date数据类型 。
格式,
CDate(日期 )
日期参数是任意有效的日期表达式 。
IsDate函数用于判断日期参数是否可以被转
换为日期或时间。 CDate识别 日期文字 和
时间文字,以及一些在可接受的日期范
围内的数字。在将数字转换为日期时,
数字的整数部分被转换为日期,分数部
分被转换为从午夜开始计算的时间。
CDate根据系统的区域设置识别日期格式 。
如果数据的格式不能被日期设置识别,
则不能判断年, 月, 日的正确顺序 。 另
外, 如果长日期格式包含表示星期几的
字符串, 则不能被识别 。
5,CDbl函数
功能:把指定的参数转换为 Double数据类
型 。
格式,
CDbl(表达式 )
表达式参数是任意有效的表达式。
可以使用子类型数据转换函数书写代码,
以显示某些操作的结果应当被表达为特
定的数据类型, 而非默认的数据类型 。
例如在出现货币或整数运算的情况下,
使用 CDbl或 CSng 函数强制进行双精度或
单精度算术运算 。
CDbl函数用于进行从其它数据类型到
Double子类型的国际公认的格式转换 。
例如, 十进制分隔符和千位分隔符的识
别取决于系统的区域设置 。
6,CInt 函数
功能:把指定的参数转换为 Integer数据类
型 。
格式,
CInt(表达式 )
表达式参数是任意有效的表达式 。
可以使用子类型转换函数书写代码,
以显示某些操作的结果应被表示为特定
的数据类型,而不是默认类型。例如,
在出现货币、单精度或双精度运算的情
况下,使用 CInt或 CLng 强制执行整数运
算。
如果表达式参数在 Integer子类型可接受的
范围 (-32768到 32767)之外, 则发生错误,
注意,CInt与 Fix 和 Int 函数不同,后两
者将数字的分数部分截尾取整,而不是
四舍五入。当分数部分恰好为 0.5时,
CInt函数通常将其四舍五入为最接近的偶
数。例如,0.5被四舍五入为 0,而 1.5被
四舍五入为 2。
7,CLng 函数
功能:把指定的参数转换为 Long数据类
型 。
格式,
CLng(表达式 )
Long数据类型可以容纳 -2,147,483,648
到 2,147,483,647之间的数。
8,CSng 函数
功能:把指定的参数转换为 Single数据
类型。
格式,
CSng(表达式 )
Single数据类型可以容纳 -3.402823E38到 -
1.401298E-45的负数, 从 1.401298E-45到
3.402823E38的正数 。
9,CStr 函数
功能:把指定的参数转换为字符串 。
格式,
CStr( 表达式)
?4.7.3 数学函数
1,Sqr函数
功能:返回指定参数的平方根 。
格式,
Sqr(number)
2,Abs函数
功能:返回指定参数的绝对值 。
格式,
Abs (number)
3,Cos/Sin函数
功能:用来计算指定参数 ( 以弧度为单位,
可以是参数或表达式 ) 的余弦或正弦值 。
格式,
Cos (number)
Sin (number)
4,Len函数
功能:计算指定字符串的长度 。
格式,
Len (String)
String也可以是字符串变量或表达式。
5,Asc函数
功能:返回指定字符的 ASCII码 。
格式,
Asc (String)
String参数可以是字符或任意有效的字符
串表达式 。
6,Chr函数
功能:根据一个 ASCII码值返回指定字符 。
格式,
Chr(charcode)
7,Rnd函数
功能:产生一个随机数 。
格式,
Rnd(number)
?4.7.4 字符串函数
字符串函数主要提供对字符串进行查找,
替换和提取的功能 。
1,Filter函数
功能:查找包含符合要求字符的字符串 。
格式,
Filter(源字符串,过滤字符串,提取方
式,搜索方式 )
源字符串可以是直接指定的字符串, 也
可以是字符串变量和数组;过滤字符串
是指定搜索的字符串 。
提取方式有两种 。 当该参数设置为 -1时,
提取包含过滤字符串的字符串;当该参
数设置为 0时, 提取不包含过滤字符串的
字符串;
搜索方式也有两种 。 当该参数设置为 -1
时, 指示为基于文本的搜索;当该参数
设置为 0时, 指示为二进制搜索 。
2,Instr函数
功能:查找某字符串在另一字符串中第一
次出现的位置 。
格式,
Instr(开始位置,源字符串,要查找的字符串
[,比较方式 ])
比较方式规定为,0时执行二进制比较;
1执行文本比较; 2执行基于包含在数据
库(在此数据库中执行比较)中的信息
的比较。
3,Mid函数
功能:从字符串中指定的起始位置返回指
定数目的字符 。
格式,
Mid(源字符串,起始位置,要求返回的字符
数目 )
4,Lcase / Ucase函数
功能:把字符串中的所有字母转换成对应
的小写字母或大写字母 。
格式,
Lcase(字符串 )
Ucase(字符串 )
5,Strreverse函数
功能:将字符串颠倒过来 。
格式,
Strreverse(字符串 )
6,Ltrim,Rtrim和 Trim函数
功能:返回不带前导空格, 后续空格或
前导与后续空格 (Trim)的字符串副本
语法,
LTrim(string)
RTrim(string)
Trim(string)
7,Space函数
功能:返回由指定数目的空格组成的字符
串 。
语法,
Space(number)
number 参数为字符串中用户所需的空格
数。
?4.7.5 格式化函数
1,FormatNumber函数
功能:返回已被格式化为数值的表达式 。
语法,
FormatNumber(expression[,NumDigitsAfterD
ecimal [,IncludeLeadingDigit
[,UseParensForNegativeNumbers
[,GroupDigits]]]])
详见书中表 4- 4,4- 5
2,FormatDateTime函数
功能:返回已被格式化为日期或时间的表
达式 。
语法,
FormatDateTime(Date[,NamedFormat])
参数,
Date 必选。要被格式化的日期表达式。
NamedFormat 可选。指示所使用的日期 /时
间格式的数值,如果省略,则使用
vbGeneralDate。
详见书中表 4- 6,4- 7
4.8 消息框和输入框
?4.8.1 消息框
消息框用来把警告、错误或者提示信息
显示给用户,同时还返回用户在消息框
中通过单击按钮反馈的信息。
( 1) 语法
MsgBox(prompt[,buttons][,title][,helpfile,
context])
MsgBox 函数中的参数见书中表 4-7。
buttons 参数见书中表 4-8。
( 2) 返回值
MsgBox 函数的返回值见书中表 4-9。
( 3) 注意
如果同时提供了 helpfile和 context,则
用户可以按 F1键以查看与上下文相对应
的帮助主题 。
如果对话框显示取消按钮, 则按 ESC
键与单击取消的效果相同 。 如果对话框
包含帮助按钮, 则有为对话框提供的上
下文相关帮助 。 但是在单击其他按钮之
前, 不会返回任何值 。
?4.8.2 输入框
输入框用来接收来自用户的输入, 它是在对话
框中显示提示, 等待用户输入文本或单击按钮,
并返回文本框内容 。
( 1) 语法
InputBox(prompt[,title][,default][,xpos][,ypos][,
helpfile,context])
InputBox 函数的参数见书中表 4-10。
( 2) 注意
如果同时提供了 helpfile和 context,就会在对
话框中自动添加, 帮助, 按钮 。
单击确定或按下 ENTER,InputBox函数返回文
本框中的内容。单击取消,返回一个零长度字
符串 ("")。
4.9 浏览器对象及 Err对象
浏览器本身的对象主要有三个,
l Location对象,URL网址对象 。
l Document对象:加载网页和 HTML
标记的对象 。
l Windows对象:浏览器打开的窗口
对象。
?4.9.1 Location对象
Location对象主要是用来获取浏览器地址栏
中的 URL字符串和设置新的 URL网址 。
例如,
http://www.microsoft.com:80/products?user=yin
Location对象的属性有以下几种,
l Href:,获取或设置完整的 URL字符
串 。
l Protocol,获取或设置 URL字符串的
协议, 通常为 http。
l Host,获取或设置 HostName:Port,例
如, 上面的例子中, HostName:Port 为
www.microsoft.com:80
lHostName,获取或设置 HostName,此
例中为 www.micosoft.com。
l Port,获取或设置 Port,此例中为本 80。
l PathName,获取或设置 URL的路径 。
l Search,获取或设置 URL中以?开头
的参数。
?4.9.2 Document对象
Document对象用来加载网页对象, 它最
常用的方法就是 Write方法, 因为该方法
在前面已经使用多次, 在这里就不再介
绍 。
?4.9.3 Windows对象
Windows对象最常使用的是它的两个事件,
Onload事件:网页加载完时产生此事件。
Onunload事件:网页上未加载时产生些事
件。
Windows对象的事件有两种方式, 一种是
在 BODY标记中指定此事件过程, 例如,
<BODY onload="<过程名称 ">
这样, 网页加载完时就会转向 BODY标记
中指定的过程 。 另一种方式是直接定义
该事件过程,
Sub Windows_onload

'事件处理代码
End Sub
?4.9.4 Err 对象
Vbscript的错误处理使用 Err对象 。 当在程
序运行期间产生错误时, Err对象就会被
创建 。 Err对象用来存储错误信息, 并提
供一些方法 。 ERR对象的格式如下,
Err.[property|method]
1,Err对象的属性
Property为 Err对象的属性, 主要有,
Description,返回描述错误的字符串。
HelpContext,为帮助文件中的题目返回
一个上下文 ID。
HelpFile,返回帮助文件的路径。
Number,返回错误数,系统为每种错误都
设有一个错误数。
Source,返回触发错误的对象名称。
为了更好地理解 Err对象的基本信息,首
先要触发一个错误,下面的代码通过语
句 document.write 15/0触发一个错误,从
而创建了一个 Err对象,并显示 Err对象的
信息,
详见书中程序 sample4-02.html
2,Err 对象的方法
Err对象有两个方法,Clear方法和 Raise 方
法,它们的功能如下,
Clear 方法:清除最近接受到的一个错误,
重置错误处理程序,以便继续执行程序。
Raise 方法:自定义错误,错误号可以选
择内置错误号,也可以自己设定。
有关此方法程序见书中程序 sample4-
03.html
4.10 在 VBScript中使用对象
无论使用的是 ActiveX控件(以前称为
OLE控件)还是 Java对象,VBScript和 IE
都以相同的方式处理它们。 ActiveX控件
使得编制内嵌式网页变得更为容易,可
以实现诸如媒体播放器之类的功能,更
可以大大缩短开发周期。如果使用的是
IE并且 ActiveX 库中安装了这些控件,就
会看到用 ActiveX控件制作的页面,否则
必须安装有关控件。
<OBJECT>标记用来包含对象,
<PARAM>标记用来设置对象属性的初始
值。使用 <PARAM>标记类似于在 Visual
Basic中设置窗体控件的初始属性值。
象对任何窗体控件一样,可以获取属
性、设置属性和调用方法。
通过定义过的窗体,cmdChangeIt 按
钮的事件过程可更改标签文本,
有关上面内容的代码请查阅书中相关
资料。
代码将对控件和值的引用限定在窗体中,
这与 简单验证 示例中的代码类似 。
ActiveX 库中有多个 ActiveX控件可用于
IE。 可以在那里找到关于属性, 方法和
事件的全部信息, 也可以在编程参考页
面上找到关于控件类标识符 (CLSID) 的
信息 。
4.11 VBScript事件处理
VBScript是一种标识语言,就像 HTML一
样,它不需经过编译,只要在支持它的
浏览器上就能运行。和 Visual Basic一样,
VBScript也是建立在, 对象, 这一概念上
的。什么是, 对象,?简单地讲对象就
是客观实体的逻辑抽象,是对属性和相
关过程的软件封装。
对象有三个重要的内容:属性
( Properties), 方法 ( Methods) 和事件
( Events) 。 属性是表征对象状态的变量,
它的值的集合就是对象所处的某个确定
的状态 。 方法是对象能够做的事情, 其
实是一些过程或函数 。 而事件则是对象
可以对之产生响应的事 。
编写脚本的目的就是处理事件 。 在
VBScript中, 有三种处理事件的方式, 它
们适用于不同的情况 。
?4.11.1 VBScript事件过程
编写事件过程是最常用的事件处理方法 。
在 VBScript中, 使用一种特殊的命名方式
来命名事件过程, 这种格式的一般形式
是:, 对象名 _事件, 。 当该对象发生事
件时, 系统就支寻找相应的处理过程来
处理它, 也就是说, VBScript通过将对象
和事件合并起来为过程命名的方法来处
理事件 。
例如下例中将一个按钮命名为 btnButton,
或以编写它的 onClick事件处理过程名为
btnButton_onClick。 当该按钮对象发生单
击事件时,系统就去寻找相应的处理过
程来处理它。 见 程序 sample4-04.html
?4.11.2 内联事件处理
使用事件过程是一种比较正式的事
件处理方式, 而处理内联事件更加简捷 。
它不用专门书写事件过程, 只需要直接
在对象的 HTML文档位置手稿即可 。 例
如上面的例子可以改写为,
<html>
<form>
<input type="button" value="Click me! "
name="btnButton" onClick='MsgBox "
Hi!You have clicked on me!You are
Welcome!" ' language="VBScript">
</form>
</html>
?4.11.3 FOR/EVENT属性
如果不想用事件过程和内联事件来
处理事件, 还可以使用 <SCRIPT>标记的
FOR和 EVENT属性 。 此属性允许把脚本
与 HTML文档中的任何对象和该对象的
事件联系起来, 其基本的格式是,
FOR,对象名, EVENT=“事件,
此处有关示例请参阅书中相关资料
? 4.11.4 VBScript的常用事件
在 VBScript中, 常用的事件有如下的几个,
1,OnFocus事件
当一个对象获得键盘焦点时该事件被
激活 。 例如可以在该事件被激活时在状
态栏中显示用户进行何种操作的提示 。
下面就是这样的一个例子, 当用户切
换到不同的区域时, 在状态栏里显示不
同的提示内容, 同时还利用 MouseMove
事件显示出光标的位置 。
程序见书中 sample4-05.html
2,MouseMove事件
每一次把鼠标移动到一个对象上时该事件
被活 。 该事件报告鼠标在移动过程中的
位置 。
3,On MouseMove事件
每一次把鼠标移动到一个对象上时该事件
被活 。 与 MouseMove不同的是它不报告
鼠标的位置 。
4,OnBlur事件
当一个对象失去键盘焦点时该事件发生 。
如下例, 当输入框失去焦点时, 状态栏提
示它已经失去焦点 。
程序见书中 sample4-06.html
5,OnChange事件
每次当用户改变对象的数据并且失去焦
点时, 该事件被激活 。 例如, 当用户在
文本框中输入完数据后, 如果用户将光
标移向下一个输入项时, 该对象被激活,
用以提示所输入的内容 。
6,OnClick事件
每次在对象上按下鼠标的左键时该事件
被激活 。 大多数的对象, 如按钮, 单选
钮, 单选框, 文本等, 都支持 onClick事
件 。
下面看一个 onClick事件的一个例子 。
程序见书中 sample4-07.html
7,OnSelect事件
每一次用户在单行或多行文本中用鼠标
或按住 shift键选取一部分内容时, 该事件
被激活 。
通过以上的学习我们可以看到, VBScript
通过事件处理程序的编程方法可以提供
交互作用 。
4.12 调试 ASP脚本
无论是否有经验,都可能会遇到程序
错误,或叫, bug”,这将影响服务器端
脚本正常工作。因此,对于开发成功和
强大的 ASP应用程序,特别是当应用程
序变得越来越复杂时,调试(即发现和
改正脚本的过程)就显得极其重要了。
?4.12.1 微软脚本调试程序工具
微软脚本调试程序工具是一个强大的调
试工具, 可以快速定位错误并可以交互
式地测试服务器端脚本 。 使用脚本调试
程序, 也可以与 IE 3.0或更高版本一起使
用, 可以,
每次运行一行服务器端脚本 。
在执行服务器端脚本期间, 打开命令窗
口以监视变量, 属性或数组元素的值 。
在脚本的指定行, ( 使用调试程序或脚
本命令 ) 设置断点以暂停执行报务端脚
本 。
运行服务器端脚本时跟踪过程。
但是,使用调试程序可以查看脚本和定
位错误,但不能直接编辑脚本。要改正
错误,必须使用编辑程序来编辑脚本,
保存更改,然后再次运行该脚本。
?4.12.2 启用调试
在开始调试服务器端脚本之前,首先必
须将 Web服务器配置为支持 ASP调试,其
操作步骤如下,
( 1) 在 Internet服务管理器中, 选择 Web站
点或应用程序的起始点目录 。
( 2) 打开目录的属性表, 然后单击, 主目
录,,, 虚拟目录, 或, 目录, 选项卡 。
( 3) 单击, 配置,, 而后单击应用程序调
试选项卡 。
( 4) 要启用调试, 请选择, 启用 ASP服务
器端脚本调试, 。 当脚本产生错误或
ASP在脚本中最到断点时, 将启动调试
程序 。
启用 Web服务器调试后, 可以使用下
面任意一种方法调试脚本,
( 1) 手工打开脚本调试程序以调试 ASP
服务器端脚本 。
( 2)使用 Internet Exploere 请求,asp 文件。
如果文件包含错误或故意用来中断执行
的语句,脚本调试程序将自动启动,显
示脚本并标出错误源。
?4.12.3 脚本错误
调试服务器端脚本的过程中, 可能
遇见几种类型的错误 。 有些错误可能导
致脚本执行错误, 中断程序的执行或返
回错误的结果 。
1,语法错误
, 语法, 错误是一种经常遇到的错误,
它是由错误的脚本语法或 VBScript语句结
构违反了一个或多个 VBScript脚本语言语
法规则引起的。例如,命令拼写错误或
传递给函数的参数值错误都可能产生错
误。语法错误可以阻止脚本运行。
如果, 就会产生 VBScript 语法错误 。
VBScript语法错误通常在执行程序前, 编
译程序时产生 。 VBScript语法错误编号及
信息见书中表 4-11。
2,运行时错误
如果 VBScript脚本执行系统无法实施的
操作,则会产生 VBScript运行时错误。只
有在运行脚本、为变量表达式赋值或分
配内存时,才会产生 VBScript运行时错误。
VBScript运行时的错误编号及信息见书中
表 4-12。
, 运行时, 错误发生在脚本开始执行之后,
它是由试图执行不可能的操作的脚本指令
所引起的 。 例如, 下面的脚本包含一个函
数, 该函数以 0作为变量的除数 ( 非法数
学操作 ), 产生运行时错误,
< SCRIPT LANGUANG = VBScript
RUNAT = SERVER>
Resrlt = Findanswer (15)
Document.Write ("结果是 " & Result)
Function Findanswer(x)
'这条语句产生运行时错误 。
Findanswer = x/0
End Function
</SCRIPT>
运行时错误必须改正,脚本才会不中断
地执行。
3,逻辑错误
逻辑错误是最难以发现的错误。这种错误
通常是由键入错误或程序逻辑上的缺陷
引起的,脚本运行没问题,但产生的结
果不正确。例如,如果服务器端脚本对
列表中的值进行排序,但在脚本中本该
使用 <(小于号)符号的地方错误地使用
了 >(大于号)符号,将导致排序结果不
正确。
?4.12.4 错误调试技术
可以使用几种不同的调试技术定位错
误源并测试应用程序 。
1,实时调试
当运行时错误中断了服务器端脚本执行
时,Microsoft脚本调试程序自动启动,
显示,asp文件,将语句指针指向导致错误
的行,并生成错误消息。使用这种类型
的调试,叫“实时调试”,计算机将暂
停进一步执行程序。必须使用编辑程序
改正错误并保存所做的更改,然后才能
继续运行脚本。
2,断点调试
当发生错误但无法轻松地找到错误源的
时候,预先设置“断点”有时会很有用。
断点在指定的脚本行暂停执行脚本。可
以在可疑的行的前面设置一个或多个不
同的断点,然后使用调试程序检查脚本
中设置的变量或属性的值。改正错误后,
可以清除断点,这样脚本就可以不间断
地运行了。
要设置断点,使用脚本调试程序打开脚
本,选择脚本中想要中断执行的行,然
后从“调试”菜单中选择“切换断点”。
然后使用 Web浏览器重新请求脚本 。 执
行到设置了断点的脚本行后, 计算机启
动脚本调试程序, 显示脚本, 并且语句
指针指向设置了断点的行 。
3,在下一条语句中断
在某些情况下,如果下一条语句运行在
所工作的,asp文件中,可能想要启用脚本
调试程序的“在下一条语句中断”。例
如,如果对驻留在名为 Sales的应用程序
中的,asp文件设置了“在下一条语句中
断”,则当运行 Sales应用程序(或已经
启用了调试的应用程序)的任何文件中
的脚本时都将启动调度程序。
有鉴于此, 当设置, 在下一条语句中断,
时, 需要注意无论下一条运行的是何种
脚本语句, 都将启动调试程序 。
4,VBScript的 Stop语句调试
也可以添加断点到用 VBScript编写的服务
器端脚本中,方法是在服务器端脚本的
可疑部分之前的某一个位置插入一条
,Stop”语句。
此功能详见书中例题。
5,JScript 的 Debugger语句
要添加断点到用 VBScript编写的服务器
端脚本中,请在脚本的可疑行之前插入
,debugger”语句。
此功能详见书中例题。
除了脚本调试程序,优秀的调试技巧可
以大大减少花费在研究脚本错误源上的
时间。虽然大多数错误有明显的来源,
如命令拼写错误或缺少变量,但还有某
些类型的逻辑和执行错误很难发现。因
此,快速而准确地找出错误的根源所在,
是程序开发者应该掌握的基本技能。
本 章 小 结
本章详细介绍了 ASP中的脚本语言
VBScript的基础知识, 包括:概念, 运算
符, 常量和变量, 过程和函数, 各种语
句等, 对一些对象, ActiveX控件的应用,
VBScript的事件处理, 以及 ASP的排错方
法和技巧也进行了介绍 。
学习本章, 可为读者继续学习本书后
续内容奠定基础 。