问:SqlHelper.ExecuteReader方法返回的sqlDataReader的connection是如何关闭的?
最近在看dnn中的cbo.vb ,这个地方搞不明白,望兄弟们指点迷津。
例如 cbo.vb 中的 Public Shared Function FillCollection(ByVal dr As IDataReader, ByVal objType As Type) As ArrayList 方法,是把datareader的内容转到ArrayList 中,其中的部分代码
While dr.Read
' fill business object
objFillObject = CreateObject(objType, dr, objProperties, arrOrdinals)
' add to collection
objFillCollection.Add(objFillObject)
End While

' close datareader
If Not dr Is Nothing Then
dr.Close()
End If
我跟了一下,dr是由SqlHelper.ExecuteReader返回的,一直纳闷dr的connection是在什么时候如何关闭的,按理说应该是在dr.Close()的时候关闭connection, SqlHelper.ExecuteReader中应该有dr.Close()自动关闭connection的设置。
查了一些帖子:有两种不同的意见
1.dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
注意括号里头的CommandBehavior.CloseConnection。这表明当我们手工关闭dataReader后,数据库连接会自动关闭。
2.如果您设置 CommandBehavior.CloseConnection 选项,则 DataReader 及其相关联的连接会在 DataReader 完成数据读取时自动关闭。这些看法不完全正确 — 只有当您在 ASP.NET Web 应用程序中使用复杂的绑定控件时,该选项才以这种方式工作。在整个 DataReader 结果集中循环到其行集的末尾(也就是说,当 Dr.Read — DataReader 的 Read 方法 — 返回 False 时)还不足以触发连接的自动关闭。不过,如果您绑定到一个复杂的绑定控件(例如,DataGrid),该控件则会关闭 DataReader 和连接 — 前提条件是您设置了 CommandBehavior.CloseConnection 选项。
不知道 SqlHelper.ExecuteReader是不是在dr.Close()时自动关闭connection的,如果是那么是如何实现的。明天晚上找找SqlHelper.代码看看。
例如 cbo.vb 中的 Public Shared Function FillCollection(ByVal dr As IDataReader, ByVal objType As Type) As ArrayList 方法,是把datareader的内容转到ArrayList 中,其中的部分代码
While dr.Read
' fill business object
objFillObject = CreateObject(objType, dr, objProperties, arrOrdinals)
' add to collection
objFillCollection.Add(objFillObject)
End While
' close datareader
If Not dr Is Nothing Then
dr.Close()
End If查了一些帖子:有两种不同的意见
1.dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
注意括号里头的CommandBehavior.CloseConnection。这表明当我们手工关闭dataReader后,数据库连接会自动关闭。
2.如果您设置 CommandBehavior.CloseConnection 选项,则 DataReader 及其相关联的连接会在 DataReader 完成数据读取时自动关闭。这些看法不完全正确 — 只有当您在 ASP.NET Web 应用程序中使用复杂的绑定控件时,该选项才以这种方式工作。在整个 DataReader 结果集中循环到其行集的末尾(也就是说,当 Dr.Read — DataReader 的 Read 方法 — 返回 False 时)还不足以触发连接的自动关闭。不过,如果您绑定到一个复杂的绑定控件(例如,DataGrid),该控件则会关闭 DataReader 和连接 — 前提条件是您设置了 CommandBehavior.CloseConnection 选项。
不知道 SqlHelper.ExecuteReader是不是在dr.Close()时自动关闭connection的,如果是那么是如何实现的。明天晚上找找SqlHelper.代码看看。

浙公网安备 33010602011771号