1

我正在运行 .NET 3.5 (C#) 和 SQL Server 2005(针对我们的客户)。我们运行的代码做了一些回归数学,有点复杂。当我在我们的网站上运行多个页面时出现以下错误:

.NET Framework execution was aborted by escalation policy because of out of memory. 
System.InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.
System.InvalidOperationException: 

我试图找出造成这种情况的根本原因:是数据库问题还是我的 C## 代码?还是在运行查询时与锁并发?还是别的什么?

代码在这里出错:

erver.ScriptTimeout = 300;
        string returnCode = string.Empty;
        using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MainDll"].ToString())) {
            connection.Open();
            using (SqlCommand command = new SqlCommand(sql.ToString(), connection)) {
                command.CommandType = CommandType.Text;
                command.CommandTimeout = 300;
                returnCode = (string)command.ExecuteScalar();
                //Dispose();
            }
            //Dispose();
        }

我们的承包商在 App_Code/sqlHelper.s 文件中编写了一堆代码来帮助处理 SQL 连接。其中一些是这样的:

public static SqlDataReader GetDataReader(string sql, string connectionString, int connectionTime) {
        lock (_lock) {
            SqlConnection connection = null;
            try {
                connection = GetConnection(connectionString);
                //connection.Open();
                using (SqlCommand cmd = new SqlCommand(sql, connection)) {
                    cmd.CommandTimeout = connectionTime;
                    WriteDebugInfo("GetDataReader", sql);
                    return cmd.ExecuteReader(CommandBehavior.CloseConnection);
                }
            }
            catch (Exception e) {
                if (connection != null)
                    connection.Dispose();
                throw new DataException(sql, connectionString, e);
            }

        }
    }

是否应该在某处释放一些内存?

4

2 回答 2

3

问题是,由于某种原因,您的 DataReader 没有被关闭。例外?用户不记得关闭 DataReader 的方法?

返回要在其主体外部使用的 DataReader 的函数将关闭它的责任留给外部代码,因此不能保证 Reader 将被关闭。如果您不关闭阅读器,则无法重用打开阅读器的连接。

因此,从函数返回 DataReader 是一个非常糟糕的主意!

您可以在此处查看有关此主题的完整讨论。

查找此函数 ( GetDataReader) 的用法,并检查是否可以保证阅读器已关闭。而且,最重要的是,这段代码不可能在第一个关闭之前重新进入并使用同一个集合打开一个新的 DataReader。(不要被 CommandBehavior.CloseConnection 误导。这只在关闭 DataReader 时负责关闭连接......只有在您没有关闭它的情况下)

于 2012-05-23T01:30:39.037 回答
0

这是因为您的数据阅读器已经填写完毕。在 finally 块中释放数据阅读器、命令、数据集、数据表并关闭连接总是更好的方法。利用 Dispose() 和 Close() 方法。

于 2012-05-23T05:20:28.450 回答