当你不能从现有的COM组件中获得你想要的功能时,你可能需要创建你自己的组件来执行你想要的行为。你一定非常喜欢创建这些组件,因为它可以让你控制更多的组件。
使用常规控制的好处有:你可以控制怎么处理错误,并且一个组件里的处理通常要快得多。譬如说,你可以在一个特定的身份下,而不是默认的IUSR_computername 或IWAM_computername下来运行组件。
一个规划得好的组件不需要对代码进行太多的改变就可以提供所有你需要的功能。如果你知道你忽略了什么功能——可能受脚本环境的限制,或者目前的组件设置没有你需要的功能,那么你可以创建一个程序的抽象设置,来实现你的要求。
我使用的常用组件在ASP页面和数据库之间起着联系作用。这种组件提供方法来运行存储的程序或者SQL语句,返回一个记录、流程(XML流程)、整数或者什么都没有。
这种组件给我带来很多好处,因为我将连接字符串隐藏在注册表的数据库中,所有传递到组件上用来从注册标提取连接字符串的是注册表关键路径的一部分。
当然,就我们目前的环境,我们只允许NTLM授权给微软SQL。我在一个特定身份下通过组件服务器来运行组件,而这种身份利用授权来处理问题。如果在处理的时候有错误出现,组件将错误写到系统程序日志。当用户在错误出现的时候忘记写下错误信息时,这将有助于纠正错误。
下面是一些我用来处理错误的比较合理的主要代码。当然,它允许我在异常情况下“自我清除”:
Public/Private
Sub/Function
ProcedureName([ByVal/ByRef
ParameterName
As
Type,
...])
[As
Type]
On
Error
GoTo
ErrHandler
Dim
m_lError
As
Long,
m_sError
As
String
m_lError
=
0
'If
return
type
for
function
is
Boolean,
then
ProcedureName
=
True
ExitCall:
On
Error
Resume
Next
'Close
connections
and
clean
up
objects;
i.e.
Set
oObject
=
Nothing
'If
you
want
your
script
to
handle
the
exceptions,
then
raise
it
here:
On
Error
GoTo
0
If
m_lError
<>
0
Then
_
Err.Raise
m_lError,
"ModuleName::ProcedureName(...)",
m_sError
Exit
Sub/Function
ErrHandler:
m_lError
=
Err.Number
m_sError
=
Err.Description
App.LogEvent
"There
was
an
error
in
the
ModuleName
component:"
&
vbCrLf
&
"Error:
"
&
m_lError
&
vbCrLf
&
m_sError,
1
Err.Clear
'If
return
type
for
function
is
Boolean,
then
ProcedureName
=
False
GoTo
ExitCall
End
Sub/Function
这里的运作原理是:程序发送所有异常事件到代码的ErrHandler部分。错误处理器将异常事件数量和描述储存到一些本地变量。然后在系统程序日志中记录异常事件。如果你的程序是一个返回Boolean型数值的函数,在这里你可以将它设置为“False”。这会将代码重新定位到ExitCall标识符。
ExitCall通过切断开放连接和删除创建对象来清除。当你试图切断没有打开的连接或文件缓冲时,增加错误处理的Resume Next(意思是如果发生错误就继续直接执行出错语句下面的那句)部分是非常重要的。如果你想组件外面的脚本处理异常情况,要用"On Error GoTo 0"语句关闭错误处理,提出异常事件,然后你就可以退出程序。
如果你想在Windows 2000的一个特定名称下运行组件,需要用管理工具在组件服务器中创建一个新的COM+服务器应用程序。当你创建这个程序时,COM+程序安装向导需要一个用户(可以是一个交互式用户,也可以是一个指定用户)。这就是为什么你要给组件增加一个服务器身份和密码,而这些组件将在COM+程序中运行。一旦它被创建,你需要在程序中增加组件。
虽然这是编码的一个小问题,但它可以让你顺利进行任务。你可以将注意力放在其功能上,而不是怎么编程这样的小问题上。当然它也有利于代码的复制和粘贴。
剩下的工作就是增加你需要的功能——但要确保你完成之后进行清除。