如何在执行多个查询时保持Connection处于打开状态?

时间:2009-03-25 18:25:09

标签: c# .net asp.net

我正在使用多个查询从我的应用程序中的同一服务器提取数据。问题是我每次有新查询时都必须打开一个新连接。

甚至可以:

  • 打开连接
  • 运行查询
  • 拉结果
  • 运行其他查询
  • 拉另一个结果
  • 运行最终查询
  • 拉另一个结果
  • 关闭连接。

6 个答案:

答案 0 :(得分:17)

虽然你可能还不知道,但你做得正确。

打开连接,执行查询,关闭它。最好使用using块或try / finally

这可能听起来像很多开销,但SQL Server的.NET Framework数据提供程序中的连接池实际上会为您优化这一点。

实际上建议关闭连接。 以下是文档中的引用:

  

始终建议你   你什么时候关闭连接   完成使用它以便   要返回池中的连接。   这可以使用   关闭或处理方法   连接对象。连接那个   未明确关闭可能不会   添加或返回池中。对于   一个已经消失的连接   超出范围,但尚未实现   明确关闭只会   如果返回连接池   已达到最大池大小   连接仍然有效。

以下是一些执行此操作的代码示例:

try {
    conn.Open();
    // Perform query here
} finally {
    conn.Close();
}

供参考:

http://msdn.microsoft.com/en-us/library/8xx3tyca(VS.71).aspx

答案 1 :(得分:2)

如果您使用具有相同连接字符串的ASP.NET,您将使用可能永远不会物理关闭的池化连接,因此您几乎总是使用可用的开放连接。

答案 2 :(得分:1)

这很有可能。假设您正在谈论Connection和DataReader。如果你每次都要创建一个不同的连接,那听起来就像是出了问题。

没有看到任何代码,我猜你要打开DataReader。这是一个大错误。默认情况下,DataReaders完全使用连接并使其未关闭可能导致泄漏。关闭DataReader,然后执行另一个。我建议将DataReader包装在一个使用块中。

罗布

答案 3 :(得分:0)

简短回答:是的。大多数数据提供商都应该这样做。

答案很长:这取决于您用于数据访问的内容。但是,您可能不需要担心它。许多数据提供程序框架都内置了连接池,因此后续的连接创建/打开不应该“真正”打开连接。

答案 4 :(得分:0)

当然,如果您正在使用SqlConnection对象,您可以执行以下操作:

connection.Open();
cmd.ExecuteReader(); // or any other form of getting the data
cmd2.ExecuteReader();
.
.
.
.
connection.Close();

我还想补充一点,如果您使用了一些SqlDataAdapters进行查询,虽然您通常不需要自己打开连接,但如果您明确调用connection.Open()则会获胜不要自动关闭连接,只允许一个连接执行多个查询。

答案 5 :(得分:0)

如果您使用C#打开连接。使用using语句将帮助您清理资源/连接,即使有一些异常抛出。

 using (SqlConnection connection =
                new SqlConnection(connectionString)
            {
                connection.Open();
                //issue command
            }

阅读本文:

http://msdn.microsoft.com/en-us/library/8xx3tyca(VS.71).aspx,您可以“使用连接字符串关键字控制连接池”,系统将为您处理池。