- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不确定嵌套的 SqlConnections
是否可行,但我真的很想远离它。我现在在我的代码中遇到了一个范围问题,我正试图弄清楚如何解决它。
所以直到最近我还有一个全局 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();
}
}
}
如您所见,在 WriteAction()
中创建了一个新的 SqlConnection
,它是从第一个 SqlConnection
的范围内调用的。不好!我正在努力避免这种情况。
在过去,这不会是一个问题,因为没有这些 using (SqlConnection)
block 并且所有 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();
}
}
这看起来是个好主意还是我会在再过两年后悔这个决定?
最佳答案
将 SqlConnection
实例传递给方法绝对没问题。但是,我不确定您是否采用了最后一种方法,没有 SqlConnection
的重载方法是个好主意。它隐藏了一个事实,即您应该更好地使用另一个新的重载。它使代码可以编译,从而阻止您修复现在应该修复的代码。
请注意,using
block 不是问题,而是打开的连接。只要不打开连接,连接池就不需要打开物理连接。
因此,在调用 WriteAction
之前关闭连接也是一个可行的选择:
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();
}
// ...
sqlConnection.Close();
ClassGlobal.WriteAction(action);
// ... perhaps open it again here
}
来自 MSDN :
Whenever a user calls
Open
on a connection, the pooler looks for an available connection in the pool. If a pooled connection is available, it returns it to the caller instead of opening a new connection. When the application callsClose
on the connection, the pooler returns it to the pooled set of active connections instead of closing it. Once the connection is returned to the pool, it is ready to be reused on the nextOpen
call.
所以你可以看到在WriteAction
中嵌套的using
是没有问题的,只要你不保持外部连接打开。不要将连接实例与物理连接混淆。
关于c# - 试图避免嵌套的 SqlConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22955341/
我是 C++ 的新手,我在使用这段代码时遇到了问题: string output_date(int day, int month, int year){ string date; if
所以我这样做了 tar cvzf test.zip FP 为了创建目录 FP 的 zip 但是,它会列出 zip 中的目录 FP/ FP/php/ FP/php/pdf/ FP/php/docs/ F
我正在尝试在 Swift、Xcode 7.3(所以是 Swift 2.2)中创建一个通用类,但我似乎无法让它通过编译器: protocol Struct1Protocol { } struct Str
我的测试用例是这样的: class FooTest extends PHPUnit_Framework_TestCase { /** @covers MyClass::bar */ f
我正在尝试将brew install wine作为使electron-builder工作的一步。但是我所能得到的只是以下响应: ==> Installing dependencies for wine
我这样做: string[,] string1 = {{"one", "0"},{"Two", "5"},{"Three","1"}}; int b = 0; for(int i = 0; i <=
我正在尝试使用 SetWindowsHookEx 键盘 Hook Notepad.exe。 如您所见,工作线程正在将其 ASCII 代码(即 wParam)发送到指定的服务器。 UINT WINAPI
我正在尝试将 ListView 实现到我的 Fragment 中,但无论我尝试什么,我都会得到一个 NullPointerException。我检查对象是否为 null 并记录是否为 null,看起来
我尝试在一行中对齐两个 div。使用 float left 属性,一切顺利。但是当我在 div 中使用图像时,它开始产生问题。 所以这是我的示例代码:- Some headi
我目前正在使用此代码来获取图像的灰度图像表示并以 (512, 370, 1) 的格式表示它大批。 img_instance = cv2.imread(df.iloc[i][x_col]) / 255.
总结 我正在创建一个简单的应用程序,它允许用户选择一个包含顶级窗口的进程。用户首先键入 native DLL(而非托管 DLL)的路径。然后用户键入将在 Hook 过程中调用的方法的名称。该方法不得返
我是一名优秀的程序员,十分优秀!