我不确定嵌套的SqlConnection
是否可行,但我真的希望远离它。现在我的代码中遇到了作用域问题,我正在尝试解决这个问题。
直到最近,我有一个全局的SqlConnection
,当应用程序启动时打开并在结束时关闭。我现在发现了.NET连接池的概念,所以我改变了我的代码,使每个SqlCommand
(或它们的组)使用自己的刚刚创建和打开的SqlConnection
,信任.NET来管理池和相关的开销。
我目前遇到的问题是,我有几个代码块看起来像这样:
using (SqlConnection sqlConnection = new SqlConnection(ClassGlobal.ConnectionString))
{
sqlConnection.Open();
using (SqlCommand sqlCommand1 = new SqlCommand("SQL code here", sqlConnection))
{
sqlCommand1.ExecuteNonQuery();
}
using (SqlCommand sqlCommand2 = new SqlCommand("SQL code here", sqlConnection))
{
sqlCommand2.ExecuteNonQuery();
}
.
.
.
ClassGlobal.WriteAction(action);
}
ClassGlobal.WriteAction()函数大致如下:
public static void WriteAction(MyActionClass action)
{
using (SqlConnection sqlConnection = new SqlConnection(ClassGlobal.ConnectionString))
{
sqlConnection.Open();
using (SqlCommand sqlCommand = new SqlCommand("Write the action to the DB", sqlConnection))
{
sqlCommand.ExecuteNonQuery();
}
}
}
如您所见,在第一个
SqlConnection
的作用域内调用了从WriteAction()
创建的新SqlConnection
。这并不好!我想避免这种情况发生。过去,这不是问题,因为没有这些
using (SqlConnection)
块,而所有的SqlCommands
都指向同一个(全局)SqlConnection
。显然,我可以简单地将我的对WriteAction()
的调用移到using (SqlCommand)
的闭合括号下面,但:
- 我传递给它的
action
实例通常是在SqlConnection
的作用域内实例化和填充的,所以我必须做更多的改变(很多),将其移出SqlConnection
的作用域。这里有很多,会很困难。 - 实际上,我希望
WriteAction()
调用可以在SqlConnection
的范围内,就像上面的示例一样,这样我就可以将其全部包装在TransactionScope
中,这是以前不可能的,但肯定是个好主意。
SqlConnection
不是一个好的实践,这导致了大量的时间修复它。我想避免在未来发现这样的问题)。如何将参数添加到WriteAction()
函数中,以使其看起来如下:public static void WriteAction(MyActionClass action, SqlConnection sqlConnection)
{
using (SqlCommand sqlCommand = new SqlCommand("Write the action to the DB", sqlConnection))
{
sqlCommand.ExecuteNonQuery();
}
}
这意味着,我不必将对
WriteAction()
的调用移到SqlConnection
的范围之外,而是可以将SqlConnection
作为函数的参数添加,以便函数内部的SQLCommand
使用相同的连接,即使该连接已被加入TransactionScope
中。对于少数情况下从没有SqlConnection
范围调用WriteAction()
的情况,可以编写一个重载的函数,看起来像这样:public static void WriteAction(MyActionClass action)
{
using (TransactionScope transactionScope = new TransactionScope())
{
using (SqlConnection sqlConnection = new SqlConnection(ClassGlobal.ConnectionString))
{
sqlConnection.Open();
WriteAction(action, sqlConnection);
}
transactionScope.Complete();
}
}
这个想法看起来不错,还是会在另外两年后后悔这个决定吗?
这个问题与IT技术无关,请提供更具体的翻译内容。