经典ASP断开连接记录问题(Classic ASP disconnected recordsets

2019-10-20 03:06发布

所以,我一直在问到更新的旧传统的ASP网站。 它没有使用参数化查询,并有非常小的输入验证。 为简单起见,我写的是打开数据库连接的辅助函数,建立与任何参数的命令对象,并创建一个连接记录[我想!?! :)]下面的代码:

Function GetDiscRS(DatabaseName, SqlCommandText, ParameterArray)

    'Declare our variables
    Dim discConn
    Dim discCmd
    Dim discRs

    'Build connection string
    Dim dbConnStr : dbConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
              "Data Source=" & rootDbPath & "\" & DatabaseName & ".mdb;" & _
              "Persist Security Info=False"

    'Open a connection
    Set discConn = Server.CreateObject("ADODB.Connection")
    discConn.Open(dbConnStr)

    'Create a command
    Set discCmd = Server.CreateObject("ADODB.Command")
    With discCmd
        Set .ActiveConnection = discConn
        .CommandType = adCmdText
        .CommandText = SqlCommandText

        'Attach parameters to the command
        If IsArray(ParameterArray) Then
            Dim cnt : cnt = 0
            For Each sqlParam in ParameterArray
                discCmd.Parameters(cnt).Value = sqlParam
                cnt = cnt + 1
            Next
        End If
    End With

    'Create the Recordset object
    Set discRs = Server.CreateObject("ADODB.Recordset")
    With discRs
        .CursorLocation = adUseClient     ' Client cursor for disconnected set
        .LockType = adLockBatchOptimistic
        .CursorType = adOpenForwardOnly
        .Open discCmd
        Set .ActiveConnection = Nothing   ' Disconnect!
    End With

    'Return the Recordset
    Set GetDiscRS = discRS

    'Cleanup
    discConn.Close()
    Set discConn = Nothing
    discRS.Close()                  ' <=== Issue!!!
    Set discRs = Nothing
    Set discCmd = Nothing
End Function

我的问题是,如果我叫discRS.Close()的函数结束,然后不填充返回的记录。 这使我想知道如果记录确实断开与否。 如果我评论说,线路输出一切工作正常。 我也做了一些Response.Write()之前使用discRS值的函数内并设置后ActiveConnection = Nothing和它正常返回的记录值。 因此,似乎是独立于discRS.Close()

我发现了一个旧的文章4guysfromrolla.com和其发布的记录Close()的函数。 我已经看到了同样的事情在其他网站上。 我不知道如果这是一个错误,或者如果事情发生了变化?

注:我使用的是IIS快递内置到Visual Studio Express的2013

Answer 1:

连接记录据我知道是指手动填充,而不是从数据库的记录,egused多维阵列或种类哈希表。

那么,你有没有断开连接的记录,因为它正在从数据库填充,并通过设置其连接你只是导致代码无法正常工作。

既然你已经Set discConn = Nothing在你的代码没有将其设置为通过记录或命令对象没什么,这是相同的连接对象。

总结这一切,你的确应该摆脱寿按照你的代码行:

  • Set .ActiveConnection = Nothing ' Disconnect!
  • discRS.Close() ' <=== Issue!!!
  • Set discRs = Nothing

然后,以防止内存泄漏或数据库锁的问题,使用的功能,例如真正使用它的代码之后,你应该关闭和处置记录

Dim oRS
Set oRS = GetDiscRS("mydatabase", "SELECT * FROM MyTable", Array())
Do Until oRS.EOF
    'process current row...
    oRS.MoveNext
Loop

oRS.Close ' <=== Close
Set oRS = Nothing ' <=== Dispose

为了避免这一切的麻烦,你可以有函数返回“真正的”断开连接的记录所有的数据复制到新创建的记录。 如果有关让我知道,我也跟一些代码。



Answer 2:

在你的函数,你不能关闭,如果你希望它返回到调用进程清理您的记录。

你可以清理所有连接和命令对象,但为了将返回填充你的记录,你根本就没有将其关闭或处置。

您的代码应该结束这样的:

    'Cleanup
    discConn.Close()
    Set discConn = Nothing
    'discRS.Close()
    'Set discRs = Nothing
    'Set discCmd = Nothing
end function


Answer 3:

在你的代码中,我可以看到:

Set .ActiveConnection = Nothing   ' Disconnect!

所以,这个记录是不是已经关闭?



Answer 4:

他确实是使用断开连接的记录。 我开始在VB6使用它们。 您可以设置连接=什么,你基本上有一个记录的所有方便的方法(即排序,查找,过滤器等...)的集合类。 另外,你只持有才能获取记录的时间连接,所以回来时,微软通过连接许可他们的服务器,这是一个很好的方式,以尽量减少多少userm在任何一个时间进行连接。

该记录是完全的功能,它只是没有连接到数据源。 您可以重新连接它,然后应用到了它所做的任何更改。

这是很久以前的事,似乎功能已被删除。



Answer 5:

您应该使用CursorLocation = adUseClient 。 然后,你可以断开记录。 我创建了一个功能来添加参数命令字典对象,然后返回一个断开连接的记录。

Function CmdToGetDisconnectedRS(strSQL, dictParamTypes, dictParamValues)

               'Declare our variables
              Dim objConn
               Dim objRS
               Dim Query, Command
               Dim ParamTypesDictionary, ParamValuesDictionary


               'Open a connection
               Set objConn = Server.CreateObject("ADODB.Connection")
               Set objRS = Server.CreateObject("ADODB.Recordset") 
               Set Command = Server.CreateObject("ADODB.Command")
               Set ParamTypesDictionary = Server.CreateObject("Scripting.Dictionary")
               Set ParamValuesDictionary = Server.CreateObject("Scripting.Dictionary")
               Set ParamTypesDictionary = dictParamTypes
               Set ParamValuesDictionary = dictParamValues
               Query = strSQL
               objConn.ConnectionString = strConn
               objConn.Open
               With Command
     .CommandText = Query
     .CommandType = adCmdText
     .CommandTimeout = 15

               Dim okey
               For Each okey in ParamValuesDictionary.Keys
                  .Parameters.Append .CreateParameter(CStr(okey), ParamTypesDictionary.Item(okey) ,adParamInput,50,ParamValuesDictionary.Item(okey))
               Next

                .ActiveConnection = objConn
           End With
               objRS.CursorLocation = adUseClient
               objRS.Open Command , ,adOpenStatic, adLockBatchOptimistic
               'Disconnect the Recordset
        Set objRS.ActiveConnection = Nothing

               'Return the Recordset
               Set CmdToGetDisconnectedRS = objRS     

               'Clean up...
               objConn.Close
               Set objConn = Nothing
               Set objRS = Nothing
               Set ParamTypesDictionary =Nothing 
    Set ParamValuesDictionary =Nothing
    Set Command = Nothing
End Function


文章来源: Classic ASP disconnected recordsets issue