这在程序上是一个坏主意吗?

时间:2011-11-16 12:51:26

标签: database asp-classic ado

目前我正在尝试为我们的网站创建一些编码捷径。现在要查询数据库并返回一个记录集,必须调用2个函数:

GetDBConn将一个开放的ado连接对象返回到传入的连接字符串。

GetRS根据传入的ado连接和sql返回记录集对象。

set objConn = GetDBConn(connString, commandTimeout, connTimeout, cursorType)
set objRs   = GetRS(objConn, sql)

我想基本上将这两个作为单个函数编写,但我的问题确实变成了这个...我很确定你应该在完成它们时关闭并销毁你的ado连接。如果我dim新函数内部的连接,查询数据库并返回记录集,我无法关闭并销毁函数内部的连接,否则函数返回的记录集变得无用(即该连接)对象永远不会被明确地关闭/销毁)。这可以吗?它会对SQL / Web服务器产生负面影响吗?

由于

3 个答案:

答案 0 :(得分:2)

不关闭连接会导致SQL Server资源出现问题。根据您的硬件和建立的连接数量,您可能不会注意到问题。或者它可能使服务器无法访问......

答案 1 :(得分:2)

将它用于记录集可能不是一个好主意(太容易忘记关闭它们),但是打开/关闭连接应该不是问题。我在所有遗留的经典ASP站点上使用以下两个函数:

conn.asp

<%
Dim oConn

Sub openConn()
    Set oConn = Server.CreateObject("ADODB.Connection")
    oConn.Open sConn 'connection string here'
End Sub

Sub closeConn()
    If IsObject(oConn) Then
        On Error Resume Next
        If oConn.State = 1 Then
            oConn.Close
        End If
        Set oConn = Nothing
        Err.Clear
        On Error Goto 0
    End If
End Sub
%>

然后我添加conn.asp并在页面顶部使用openConn(),在底部使用closeConn()

On Error Resume Next通常被视为“糟糕的编码”练习,但是在这种情况下,我认为这是合适的,否则您将在使用closeConn()的所有页面上获得错误oConn.State因任何原因失败的情况。

答案 2 :(得分:1)

我一直使用MS参考应用FmStocks提供的dbhelper.asp 这些函数总是返回一个断开连接的记录集,所以你永远不会遇到麻烦

这些功能就像这样:

Function RunSQLReturnRS(sqlstmt, params())
    On Error Resume next

    ' Create the ADO objects'
    Dim rs , cmd
    Set rs = server.createobject("ADODB.Recordset")
    Set cmd = server.createobject("ADODB.Command")

    ' Init the ADO objects  & the stored proc parameters'
    cmd.ActiveConnection = GetConnectionString()
    cmd.CommandText = sqlstmt
    cmd.CommandType = adCmdText
    cmd.CommandTimeout = 900 ' 15 minutes

    collectParams cmd, params

    ' Execute the query for readonly'
    rs.CursorLocation = adUseClient
    rs.Open cmd, , adOpenForwardOnly, adLockReadOnly
    If err.number > 0 then
        BuildErrorMessage()
        exit function
    end if

    ' Disconnect the recordset'
    Set cmd.ActiveConnection = Nothing
    Set cmd = Nothing
    Set rs.ActiveConnection = Nothing

    ' Return the resultant recordset'
    Set RunSQLReturnRS = rs

End Function