ASP自动关闭并注销对象

使用VBS编写ASP代码是一件非常繁琐的事情,如果你愿意听,关于这个方面的问题,我可以讲上几个小时,甚至几天。想听的朋友,我下面就先发一发这些牢骚,不想听的,可以略过。

1.VBS没有三元表达式,任何一个判断都要写 If ... Then ... Else ... End If,恐怕这句语法,是在ASP中出现的最多的了。

2.VBS的变量很讨厌,它即是脚本语言,具有动态类型的特性,但很多时候它会出错,比如,一个普通变量和数组不能混用,一个动态数组经常会下标越界。

3.跟上面类似,但我想强调一下,所以分开来说,就是ASP中的数组,你要添加一个元素,必须是动态的数组,必须使用ReDim,如果不加Preserve它原有的内容会被清空。一个空数组使用UBound会出错(下标越界)。而且ASP对于数组的操作很贫乏。在诸多语言里,只有VBS的多维数组算是真正的多维,但它又是那样鸡肋,使用麻烦,容易混淆,不容易处理...

4.对象赋值必须使用Set关键字,否则,要么返回一个非对象变量,要么出错。

5.函数的参数,必须有多少写多少,有多少传递多少(而系统函数可以做到灵活传参)。为了便于使用,我一般控制一个函数参数3个以内。

6.面向对象太弱了,无法继承,无法初始化传参...

...

OK,牢骚暂时到这里吧,下面转入正文,我写的标题是ASP自动关闭并注销对象,也许很多人还没明白意思。所以我先从头说起:

在上面最后一条(第6条),我说过面向对象很弱,虽然弱,但依然有它的好处,VBS的Class还是有很大用处的。我也见过一些使用Class写出来的非常强大和方便的ASP程序,并且,我也对VBS中的Class作过一些研究,正因如此,看到很多没用使用这些便利条件的ASP程序,不免叹息唾弃。我在工作中便遇到过这样的事情,所以在寻求解决方法的时候总结出了这个方法,自觉得还算好用,所以共享出来。

众所周知,VBS中连接操作数据库使用了两个对象ADODB.Connection和ADODB.Recordset,这些对象还是非常方便的,但关键问题在于,Connection对象不及时关闭,或多或少会影响到服务器的运行质量,我们之前的作法是,在页面头部或公共的包含文件里像下面这样定义一个Connection对象

Dim conn
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open connectionStr   '这里不详细写连接字符串了

同时在页面底部调用下面代码以关闭并释放连接

conn.Close
Set conn=Nothing

这样的做法,一般来说是没有问题的,然而问题在于,每个页面都需要手动去关闭,而且,如果需要在页面半途中止输出,那这个关闭其实就无法调用到了,也许你会说,可以在中止输出前再关闭一下。

方便一点的做法是,写一个包含错误兼容的关闭函数,在需要的时候调用它,就像下面这个函数

Function CloseConn
    If conn.State<>0 Then conn.Close
    Set conn=Nothing
End Function

这样调用起来方便了些,如果是从头写程序,这样做并没什么问题,但如果是修改一套大量页面没有关闭链接的程序,而且你不确定这些页面的何时会中止输出,这个方法就不太好使了,另一方面,由于需要手动关闭链接,你要中止页面输出也会显得不随意和自然,那么我的解决办法是,利用类的析构函数来关闭并释放链接,我们可以把上面那个函数放到一个类的析构函数里面,打开链接的同时实例化这个类,在页面运行结束的时候,系统会帮你注销这个类,同时就关闭了数据链接

Dim conn, autoCloseConn
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open connectionStr   '这里不详细写连接字符串了
Set autoCloseConn = New AutoCloseConnection
Class AutoCloseConnection
    Private Sub Class_Terminate
        If conn.State<>0 Then conn.Close
        Set conn=Nothing
        '为了证实关闭了链接,我们这里输出一个记号
        Response.Write TypeName(conn)
    End Function
End Class

如果你在你的ASP页面底端看到了Nothing,那么恭喜你,你页面中开放的链接已经自动关闭了,你可以随意地中止页面输出,或放任页面运行,当页面执行完毕时,它会自动关闭你开启的链接,当然,你可以删除掉最后为了证明链接已经关闭的输出内容,它肯定会影响到你页面的美观的。