使用声明connection.open

我正在查看一些代码并与同事讨论。使用声明connection.open

特别是一段代码,看起来像这样。

[Test] 

public void TestNormalWay()

{

using(var cn = GetConnection())

{

cn.Open();

// do stuff

}

}

的问题上来:

“为何不动的cn.Open到getConnection方法。”

我说如果“打开”引发异常处置不会被调用。他的回应是:

“那么,什么。连接没有打开,那么为什么它需要得到 关闭(或处置)?”

对我来说,这只是一个不想知道是否需要处置/关闭的问题,所以我会在代码中重复使用cn.Open,而不是将其移入共享函数。

但有趣的是...所以我做了一些阅读在SQL Server Connection Pooling (ADO.NET)

对我来说,如果存在其中调用cn.Open,它抛出一个场景,异常的处置将是不明确需要被调用。

在我下面的例子

那么,真的有什么区别“TestNormalWay”和“WhyNotDoItThisWay”

protected static DbConnection GetConnection() 

{

DbConnection cn = new SqlConnection("SomeConnecitonstring... ");

return cn;

}

protected static DbConnection GetConnectionDangerousVersion()

{

DbConnection cn = new SqlConnection("SomeConnecitonstring... ");

cn.Open(); // this will throw.. .dispose not called

return cn;

}

[Test]

public void TestNormalWay()

{

using(var cn = GetConnection())

{

cn.Open();

// do stuff

}

}

[Test]

public void WhyNotDoItThisWay()

{

using(var cn = GetConnectionDangerousVersion())

{

// do stuff

}

}

回答:

您在编写代码的方式,你总是尽快打开连接,因为它是间没有什么区别。

但是,您可以多次打开和关闭连接,并在代码中设计这样做有很大的不同。

我可能想写一些代码,我有一个长时间运行的例程,需要一个连接对象并随着时间的推移打开和关闭它。例程可能不关心连接对象是如何创建的。因此,将创建连接的行为与打开和关闭行为分开是有利的。

关于资源管理问题,我同意这不是一个问题。本身创建一个SQL连接对象并不会锁定任何资源,而是打开它获取池连接的操作。如果打开返回异常,我认为假设连接未打开是合理的。

回答:

您可以在第二个“危险”版本中围绕.Open()调用放置一个try/catch,以便在打开时仍然抛出异常并处理连接。

回答:

我会倾向于返回SqlConnection的实例,而无需在您的方法中调用Open()。如果需要,应该这样做。在您的实用功能中不需要它。

其中一个原因是,有一些对象需要SqlConnection,但不一定需要打开它们。例如,SqlDataAdapter需要SqlConnection,并在其内部处理其打开和关闭。当然,你可以在通过它之前打开一个连接,但是你必须明确关闭它。

回过头几步,应该是调用代码的责任来处理与SqlConnection完全相同的操作。

回答:

在对SqlConnection的内部进行调整之后,我确信它确实没有关系。快速测试似乎证实了这一点:

static void Main(string[] args) 

{

Func<SqlConnection> getConnection =

() =>

{

var connection =

new SqlConnection(

"Initial Catalog=myDatabase;Server=(local);Username=bogus;password=blah;Connect Timeout=10;");

connection.Open();

return connection;

};

while(true)

{

try

{

using(var connection = getConnection())

{

var cmd = new SqlCommand("SELECT 1", connection) {CommandType = CommandType.Text};

cmd.ExecuteNonQuery();

}

}

catch (Exception)

{

// ignore exception

}

}

}

我离开了这个代码几分钟的附带一个分析器运行。它不仅运行速度很快,而且不会泄漏任何内存。这很让我信服,可以在GetConnection方法中打开连接。

当然这里发布的所有其他论据仍然有效;你应该只打开连接,如果你要立即使用它。

以上是 使用声明connection.open 的全部内容, 来源链接: utcz.com/qa/265361.html

回到顶部