【问题标题】:Is this programmatically a bad idea?以编程方式这是一个坏主意吗?
【发布时间】:2012-02-01 07:40:40
【问题描述】:

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

GetDBConn向传入的连接字符串返回一个打开的ado连接对象。

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

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

我想基本上把这两个写成一个函数,但我的问题真的变成了这个......我很确定你应该在完成它们后关闭并破坏你的 ado 连接。如果我dim新函数内部的连接,查询数据库并返回记录集,我不能关闭和销毁函数内部的连接,否则函数返回的记录集变得无用(即那个连接对象是从未明确关闭/销毁)。那样行吗?是否会对 SQL/Web 服务器产生负面影响?

谢谢

【问题讨论】:

  • 请注意您的标签选择...下次使用前请查看ASP标签的说明。
  • @JoelCoehoorn:对不起,我的错。以后会做的。

标签: database asp-classic ado


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    将它用于记录集可能不是一个好主意(太容易忘记关闭它们),但是打开/关闭连接应该不是问题。我在所有旧版 Classic 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 通常被认为是一种“糟糕的编码”做法,但在这种情况下,我认为这是合适的,否则对于那些使用@987654328 的边缘情况,您将在使用closeConn() 的所有页面上遇到错误@ 因任何原因失败。

    【讨论】:

      【解决方案3】:

      我一直使用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
      

      【讨论】:

      • 这条线是什么? "collectParams cmd, 参数"
      • 是另一个函数,它收集参数数组并将它们放入命令中。源代码在答案中链接的下载中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 2020-12-12
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多