SQL Server ExecuteReader 需要一个开放且可用的连接。连接的当前状态为关闭



我正在使用一个多线程应用程序从数据库中提取数据,运行几分钟后,我开始得到这个异常或sql超时异常。我的代码如下:

    public static List<FlightInfo> FlightInfoAllPricesPerDayForRoute(string From, string To)
    { // Create the object array from the datareader
        List<FlightInfo> arr = new List<FlightInfo>();
        using (var conn = new SqlConnection(sConnectionString))
        {
            using (var command = new SqlCommand("FlightInfoAllPricesPerDayForRoute", conn)
            {
                CommandType = CommandType.StoredProcedure
            })
            {
                conn.Open(); command.CommandTimeout = 150;
                command.Parameters.AddWithValue("AirportFrom", From);
                command.Parameters.AddWithValue("AirportTo", To);
                // command.Parameters.AddWithValue("Date",  dt);

                //execute the stored procedure
                using (IDataReader dr = command.ExecuteReader())
                {

                    FlightInfo obj;
                    while (dr.Read())
                    {
                        obj = new FlightInfo();
                        obj.flightInfoID = (int)dr["FlightInfoID"];
                        obj.airportFrom = (string)dr["AirportFrom"];
                        obj.airportTo = (string)dr["AirportTo"];
                        obj.timeDeparture = DateTime.Parse(dr["TimeDeparture"].ToString());
                        obj.timeArrival = (DateTime)dr["TimeArrival"];
                        obj.price = (short)Int16.Parse(dr["Price"].ToString());
                        obj.dateAdded = (DateTime)dr["DateAdded"];
                        obj.carrier = (string)dr["Carrier"];
                        arr.Add(obj);
                    }
                    dr.Close(); dr.Dispose(); conn.Close(); conn.Dispose(); command.Dispose();

                }
            }
        } return arr;
    }

我已经添加了以下的连接字符串,以改善超时问题,但仍然得到错误:

   Min Pool Size=200;Max Pool Size=32767;Asynchronous Processing=true;   Connect Timeout=150;

存储过程非常简单,所以我认为没有问题:

select *,  DATEADD(dd, 0, DATEDIFF(dd, 0, TimeDeparture)) as FlightDate
from FlightInfo  
where AirportFrom = @AirportFrom and AirportTo = @AirportTo
AND TimeDeparture > GETDATE() -- Only get future flights
Order by FlightDate ASC, Price asc

我也试过运行这个来检查sql连接,但我得到一个'用户没有权限执行此操作。的误差

  SELECT * FROM sys.dm_exec_connections

任何建议都将非常感谢!

您的代码看起来不错-我建议您查看数据库服务器上的问题。如果存储过程需要很长时间来运行和/或在表中导致大量锁定,您可能会遇到这些问题(特别是如果经常调用它)。一些查询优化可能是有序的。

供您参考-您不需要在SqlCommand对象周围使用'using'块。此外,也没有必要调用'close'和'dispose'对您的阅读器和连接对象- 'using'将为您处理。

在运行带有某些参数的SP时出现了一个问题,因为在向数据库插入代码时出现了一个问题,这意味着在某些情况下会添加许多重复条目。当我试图使用具有许多重复db条目的参数从数据库中提取数据时,SP运行得非常慢。删除这些重复项可以改善问题。

相关内容

  • 没有找到相关文章

最新更新