- 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/
使用 DataSnap 2009,我似乎可以在客户端数据模块中使用远程数据库连接,使用 TDSProviderConection 和关联的 TSQLConnection。客户端很容易设置,我在表单上放
我很好奇为什么会这样。我今天早些时候遇到了这种情况 using (SqlConnection oConn = new SqlConnection(ConnectionString)) { us
我正在用 .Net Reflector 检查 SqlConnection . 我注意到有一个私有(private)构造函数,有趣的是它接受一个 SqlConnection 类作为参数。 我想知道的主要
我的问题:本周早些时候,我接到了加速我们程序中的任务的任务。我看着它,立即想到了在该任务中为函数使用并行 foreach 循环的想法。 我实现了它,通过了函数(包括所有子函数)并更改了 SqlConn
我想执行一个 SELECT 查询,然后执行一系列 UPDATE 查询(都在同一个表上); UPDATE 在重复调用的单独方法中实现。如果其中一个 UPDATE 查询失败,我希望它们全部失败/回滚 -
做什么 using (SqlConnection cn = new SqlConnection(connectionString)) 做吗? 最佳答案 new SqlConnection(connec
您好,我想问一下,创建 Singleton 以仅与 db 建立一个事件连接是否是个好主意。我想做的是: 1) 我有 wcf 服务 2)wcf服务从db获取数据 3)我想创建一个这样的单例,只有一个连接
尊敬的专业人士请帮我解决以下问题。在我的 .NET C# 应用程序中,有以下代码: SqlConnection connection = new SqlConnection( SQLCONNECTIO
我正在尝试更新一些代码。我有一个以此开头的 vb 文件... Imports System.Data.SqlClient Imports System.Data.Sql Imports System.
如果我打开一个到 SQL Server 的 SqlConnection,然后从多个后台线程发出多个查询,所有查询都使用该一个连接 - 这些查询是否会按顺序执行(不关心顺序) )? 具体来说,如果在一个
我们有一个使用 SQL Server 2008 R2 数据库的应用程序。在应用程序中,使用 SqlConnection 对象调用数据库。 此SqlConnection 对象在第一次访问时初始化一次,然
我正在尝试优化访问 SQL Server 2014 数据库的代码性能,并注意到连接池似乎并不像 ADO.NET 所宣传的那样工作。默认情况下,它应该被启用并且开箱即用(只要使用相同的连接字符串)。然而
我正在尝试使用 SqlConnection 和 SqlCommand 对象建立一个简单的 MS Access 数据库连接。 正如您在此处看到的,我是如何建立联系的: private SqlConnec
我有一个连接到数据库的 .NET 应用程序。 在我的 web.config 文件中有 用户名和密码已删除。 在我后面的代码中,我这样打开连接 protected void grabDat
SqlDataReader rdr = null; con = new SqlConnection(objUtilityDAL.ConnectionString); using (SqlCommand
public class db { public static string connectionString = WebConfigurationManager.Con
我需要你的帮助(眼睛)看看我哪里错了。 所以,我遇到了这个错误... 这是我正在做的... 一个登录用户,有一个角色,这个角色有或没有一些权限。 当他输入表单时,应用程序会根据他的角色检查用户权限。在
我不确定嵌套的 SqlConnections 是否可行,但我真的很想远离它。我现在在我的代码中遇到了一个范围问题,我正试图弄清楚如何解决它。 所以直到最近我还有一个全局 SqlConnection,它
我编写了以下代码(为简洁起见进行了删减): using (SqlConnection cn = new SqlConnection("Server=test;Database=test;User=te
我在另一台服务器上读取和写入数据到 Sql Server,因此我需要打开许多 SqlConnection,我在读取或写入完成后关闭它们,但有时我无法连接到服务器但是在我重新启动服务器后一切正常,我猜这
我是一名优秀的程序员,十分优秀!