如何在使用SqlDataSource或ObjectDataSource时关闭连接/ datareader

时间:2008-10-20 18:40:52

标签: asp.net ado.net connection-pooling

在beta测试期间,我们发现了连接池错误消息。因此,我一直在浏览代码并关闭SqlDataReader对象,无论它们在哪里都未被封闭。我需要知道的是如何关闭在SqlDataSource或ObjectDataSource标记的SelectStatement属性中指定的datareader(或者根本需要关闭)。如果没有处理它们会有连接泄漏吗?

提前致谢!

7 个答案:

答案 0 :(得分:12)

我倾向于使用“using”关键字,尤其是在处理打开和关闭数据库连接时。 “使用”是Dispose模式的快捷方式 - here是MSDN写入的链接,here是指向有用博客条目的链接,其中包含概述。

答案 1 :(得分:4)

为了提高Close()/ Dispose()的性能,请考虑在处理或关闭阅读器之前在关联的命令对象上调用Cancel(),尤其是当您没有到达记录集的末尾时。

例如:

            using (var cmd = ... ))
            {
                using (var reader = (DbDataReader) cmd.ExecuteReader())
                {
                    try
                    {
                        ConsumeData(reader); // may throw
                    }
                    catch(Exception)
                    {
                        cmd.Cancel();
                        throw;
                    }
                }
            }

答案 2 :(得分:2)

我的理解是,使用SqlDataSource,会为您执行连接管理,您无需担心。

ObjectDataSource首先不直接与数据库通信,因此只要底层对象正确执行其连接和读者管理,它就是安全的。

正如其他人所说,Close()using是您与ObjectDataSource一起使用的课程的朋友。

我的预感是,如果你有效地清理了代码库,你可能已经根除了这个问题。

答案 3 :(得分:2)

我们在生产环境中遇到了同样的问题。

解决了这个问题。问题首先是,我的代码中根本没有使用语句。 (这是几年前建立的,知识较少)。

然后我尝试将SqlDataSource放在using子句中。但这也无济于事。

这里的诀窍是,就像tvanfosson和Mischa所建议的那样,将读者置于一个使用条款中。这是实际关闭连接的对象。

在中等负载下,连接数量缩减到最小池大小为10。

答案 4 :(得分:0)

调用.Dispose()应该处理清理并释放任何保留的资源,但是.Close() method should be getting called as well when an object is done reading from the reader

答案 5 :(得分:0)

我相信SqlDataSource会处理它自己的连接/阅读器问题,所以不用担心。至于你的手动连接,我发现这种模式过去很有用:

   using (SqlConnection connection = new SqlConnection(connectionString))
   {
      try
      {
         SqlCommand command = connection.CreateCommand();
         command.CommandText = ...

         connection.Open();
         using (SqlDataReader reader = command.ExecuteReader())
         {
            do
            {
               while (reader.Read())
               {
                  ... handle each row ...
               }
            } while (reader.NextResult());
         }
      }
      catch (Exception ex)
      {
          ... error handling ...
      }
      finally
      {
         if (connection != null && connection.State == ConnectionState.Open)
         {
            connection.Close();
         }
      }
  }

答案 6 :(得分:-1)

我同意,对于ObjectDataSource,结束应该由其Select方法处理。我的ObjectDataSource Select方法返回一个SqlDataReader。我担心的是......在将SqlDataReader返回到UI后关闭时,它将变得无用。例如请参阅以下示例代码。我没有尝试过,也不想在这个开发阶段这样做。

SqlDataReader MySelectMethod(){
   SqlDataReader dr = null;
   try{
      dr = DBObject.GetDataReader();
      return dr;
   }
   finally{
      dr.Close();
   }
}

感谢到目前为止收到的所有意见!

...........

  

我的理解是   SqlDataSource,连接管理   是给你的,你有   无所畏惧。

     

ObjectDataSource不与之对话   数据库直接放在首位,   所以它会安全 - 只要   底层对象执行它   连接和读者管理   正确。

     

正如其他人所提到的,Close()和   使用是你的朋友的课程   你使用ObjectDataSource