所以,我一直在问到更新的旧传统的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
连接记录据我知道是指手动填充,而不是从数据库的记录,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
为了避免这一切的麻烦,你可以有函数返回“真正的”断开连接的记录所有的数据复制到新创建的记录。 如果有关让我知道,我也跟一些代码。
在你的函数,你不能关闭,如果你希望它返回到调用进程清理您的记录。
你可以清理所有连接和命令对象,但为了将返回填充你的记录,你根本就没有将其关闭或处置。
您的代码应该结束这样的:
'Cleanup
discConn.Close()
Set discConn = Nothing
'discRS.Close()
'Set discRs = Nothing
'Set discCmd = Nothing
end function
在你的代码中,我可以看到:
Set .ActiveConnection = Nothing ' Disconnect!
所以,这个记录是不是已经关闭?
他确实是使用断开连接的记录。 我开始在VB6使用它们。 您可以设置连接=什么,你基本上有一个记录的所有方便的方法(即排序,查找,过滤器等...)的集合类。 另外,你只持有才能获取记录的时间连接,所以回来时,微软通过连接许可他们的服务器,这是一个很好的方式,以尽量减少多少userm在任何一个时间进行连接。
该记录是完全的功能,它只是没有连接到数据源。 您可以重新连接它,然后应用到了它所做的任何更改。
这是很久以前的事,似乎功能已被删除。
您应该使用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