Database 这在编程上是个坏主意吗?

Database 这在编程上是个坏主意吗?,database,asp-classic,ado,Database,Asp Classic,Ado,目前,我正在尝试为我们的网站创建一些编码捷径。现在要查询数据库并返回记录集,必须调用2个函数: GetDBConn将打开的ado连接对象返回给传入的连接字符串 GetRS基于传入的ado连接和sql返回记录集对象 set objConn = GetDBConn(connString, commandTimeout, connTimeout, cursorType) set objRs = GetRS(objConn, sql) 我想把这两个函数写成一个函数,但我的问题是。。。我非常确定,当

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

GetDBConn
将打开的ado连接对象返回给传入的连接字符串

GetRS
基于传入的ado连接和sql返回记录集对象

set objConn = GetDBConn(connString, commandTimeout, connTimeout, cursorType)
set objRs   = GetRS(objConn, sql)
我想把这两个函数写成一个函数,但我的问题是。。。我非常确定,当完成ado连接时,您应该关闭并销毁它们。如果我
dim
新函数内的连接,查询数据库并返回记录集,我无法关闭并销毁函数内的连接,否则函数返回的记录集将变得无用(即,该连接对象从未显式关闭/销毁)。可以吗?它会对SQL/Web服务器产生任何负面影响吗


谢谢

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

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

将其用于记录集可能不是一个好主意(太容易忘记关闭它们),但是打开/关闭连接应该不会有问题。我在所有传统的经典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()


下一步错误恢复时的
通常被视为“糟糕的编码”实践,但在这种情况下,我认为这是适当的,否则您使用的所有页面都会出现错误
closeConn()
对于那些因任何原因而导致连接状态失败的边缘情况,启用该选项。

将其用于记录集可能不是一个好主意(很容易忘记关闭它们),但是打开/关闭连接不应该是一个问题。我在所有传统的经典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()


下一步错误恢复时的
通常被视为“糟糕的编码”实践,但在这种情况下,我认为这是适当的,否则您使用的所有页面都会出现错误
closeConn()
对于那些因任何原因而失败的边缘情况,
oConn.State

我一直使用MS reference应用程序提供的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

我一直使用MS reference应用程序提供的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

请注意您的标签选择。。。下次使用前,请检查
ASP
标记的说明。@JoelCoehoorn:对不起,我的错。以后就可以了。请注意您的标签选择。。。下次使用前,请检查
ASP
标记的说明。@JoelCoehoorn:对不起,我的错。将来可以。这条线是什么?“collectParams cmd,params”是另一个函数,用于收集param数组并将其放入命令中。源代码在答案中的下载链接中。这一行是什么?“collectParams cmd,params”是另一个函数,用于收集param数组并将其放入命令中。源代码在答案中的下载链接中。