打开已经关闭的SqlConnection

4

每次打开和关闭一个SqlConnection对象与创建新对象相比,有什么问题吗? 例如:

SqlConnection conn = new SqlConnection(ConnectionString);
conn.Open();
//Some work here
conn.Close()
//Some work here... conn stays in scope
conn.Open()

第二次打开连接会导致非法状态异常吗?


我认为这很好 - 但记得在不再使用它时调用 Dispose() - Bridge
1
我认为这引出了一个问题...为什么一开始要关闭它呢? - Dave Zych
只需使用 using (SqlConnection conn = new SqlConnection(ConnectionString)) { //your code } - 这将为您进行处理和关闭。答案是“否”,长时间打开/关闭连接并没有问题,只要它是活动对象。问题是为什么? - T.S.
3个回答

4

关闭连接后,您可以重新打开它(但是您不能重新打开已释放的连接)。

至于Dave Zych的问题-我们的一些客户在其数据库上拥有每个连接的许可证,关闭连接允许其他应用程序使用它。

通常情况下,您会启用连接池,这样数据库的实际连接不会立即被关闭,而是可以被应用程序内的其他相同的连接对象使用。


1

这个没有问题。您可以随意打开和关闭连接。但是,我想知道为什么您要打开和关闭同一个连接,而不是为每个调用创建一个新的连接。这是因为您正在快速连续地进行多次调用吗?如果是这样,您可以考虑使用单个SqlConnection,在开始时打开它并在结束时关闭它。


实际上,我有一个类,它作为一些旧的VB库的代理。这些VB模块需要开始和提交事务的方法 - 因此我的类实例中应该有连接对象。由于类的生命周期实际上很长,我不能永远保持连接打开 - 所以我想知道是否可以在关闭/打开周期中每个实例仅保留一个连接对象,而不是每次重新创建它。 - Aloraman

1
打开和关闭同一连接与创建新连接然后打开和关闭它一样,只要连接字符串不改变。

原因: ADO.NET使用称为连接池的技术。当您使用连接字符串打开连接时,ADO.NET将查看池并查看该连接字符串是否已存在于池中,如果答案是是,则它将获取此连接并为您打开该连接。否则,ADO.NET将添加一个具有该连接字符串的连接到池中并打开该连接。 这就是为什么第一次访问数据库总是比其他时间慢的原因。

详情请参见:https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接