風雲論壇后台开发 → 浏览:帖子主题
* 帖子主题:ASP 全局自动关闭 数据库连接
風雲 (ID: 3)
头衔:论坛版主
等级:光明使者
积分:494
发帖:31
来自:保密
注册:2022/3/30 15:28:53
造访:2023/1/19 16:21:40
[ 第 1 楼 ] 回复
近期发现部分网友编写 ASP 时,很自豪的说,我从不关闭 Conn 和 Rs 对象,每次使用都是直接 CreateObject,从没出过问题。
😂 这是流量小的网站,一般看不出问题来。不过从中折射出一个问题:即使过了20来年,还是有人不喜欢做一些看起来可做可不做的事。只要不做没有出现什么问题,为什么要去做呢?

当然,这里并不是说 Conn 和 Rs 不需要关闭,反而是很有必要关闭!至于为什么,某度能查出一大堆原因吧。

这里只是对数据库连接做了一个简单的封装,并且利用了VBS类中析构函数(Class_Terminate)的特点,实现了页面执行完成后自动关闭数据库连接,附带了一个查询SQL的功能。

应用场景例如:网站已经写了100多个页面了,公共调用了变量 Conn,一开始都忘了关闭数据库了,怎么办?一般的做法,应该是重新编辑那100多个页面,每个页面的最后都加一个关闭连接的语句,这是多么劳神劳力!但是封装之后,只需要将原来公共的 Set Conn 那里改成:
Set Db = New DbHelper
Set Conn = Db.GetConn
即可。这么做还有一个优势是:即使你的页面运行时发生错误,仍然不会影响到自动关闭数据库连接!
2023/1/16 14:32:49 IP:已设置保密
風雲 (ID: 3)
头衔:论坛版主
等级:光明使者
积分:494
发帖:31
来自:保密
注册:2022/3/30 15:28:53
造访:2023/1/19 16:21:40
[ 第 2 楼 ] 回复
相关测试代码如下:
将以下代码保存到桌面,文件名为:DbHelper.vbs,双击运行即可看到效果(注意:脚本中如果存在中文,则保存时必须使用 ANSI 编码)。
Set Db = new DbHelper
MsgBox "run 1: " & Db.Query("select getdate()")(0)
MsgBox "run 2: " & Db.Query("select getdate()")(0)

Class DbHelper
    Private Conn, Rs

    Public Function Query(sql)
        If GetRs.State = 1 Then Rs.Close
        Rs.Open sql, GetConn, 1, 1
        Set Query = Rs
    End Function

    Public Function GetConn
        If IsEmpty(Conn) Then
            Set Conn = CreateObject("Adodb.Connection")
            Conn.Open "Provider=Microsoft.Windows.SqlLite.OleDb.4.0; Data Source=Test.sdf"
        End If
        Set GetConn = Conn
    End Function

    Public Function GetRs
        If IsEmpty(Rs) Then Set Rs = CreateObject("AdoR.RecordSet")
        Set GetRs = Rs
    End Function

    Private Sub Class_Terminate
        If Not IsEmpty(Rs) Then
            If Rs.State = 1 Then Rs.Close
            Set Rs = Nothing
        End If

        If Not IsEmpty(Conn) Then
            If Conn.State = 1 Then Conn.Close
            Set Conn = Nothing
        End If
    End Sub
End Class
2023/1/16 14:41:50 IP:已设置保密
pojin (ID: 2)
等级:精灵
积分:144
发帖:1
来自:保密
注册:2022/3/30 11:42:27
造访:2023/1/19 16:30:58
[ 第 3 楼 ] 回复
学习学习。
2023/1/17 9:22:02 IP:已设置保密
分页: 1, 共 1 页
快速回复主题
账号/密码
用户: 没有注册? 密码:
评论内容