首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在DAL方法中重用SqlConnection

在DAL方法中重用SqlConnection
EN

Stack Overflow用户
提问于 2010-07-15 03:59:36
回答 4查看 1.4K关注 0票数 0

假设我们有一个DAL方法

代码语言:javascript
复制
public void BuyProduct(int productId, int quantity, int buyerId);

在该方法中,我们需要调用2个存储过程:

tblOrders_CreateNewOrder

  • EXEC tblProducts_RecalculateStock

创建2个SqlCommands (每个存储过程一个)并使用单个SqlConnection执行这些命令是一个好做法吗?

为每个SqlConnection创建一个单独的SqlCommand更好吗?

因此,基本上我是在问:是一个好的实践吗?在单个DAL方法中为多个(2-4) SqlCommands重用单个DAL是否是一个很好的实践(显然,在整个DAL中重用SqlConnection是愚蠢的)?

PS -请不要问我为什么我不能把两个存储过程合并成一个。我的回答是-分离关注点。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-15 04:16:29

真正的问题不是连接,而是交易。当一个逻辑操作涉及多个DAL物理操作时,通常它们必须是一个超越的一部分。除非核可是可选的..。如果事务跨越多个连接,则必须将其提升为分布式事务,从而导致灾难性后果。因此,在设计DAL时,总是将事务与连接关联起来。这影响了DAL的设计,因为通常的结果是,连接和事务对象必须作为单独的参数或聚合它们的“上下文”对象明确地传递给DAL方法。

票数 5
EN

Stack Overflow用户

发布于 2010-07-15 04:33:54

是的,重用单个SqlConnection用于多个SqlCommands (在一个方法中)是一个很好的实践。正如我在您的例子中所理解的,您还需要像这样使用SqlTransaction:

代码语言:javascript
复制
public void SomeDALMethod(string connectionString)
{
    using (var connection = new SqlConnection(connectionString))
    {
        connection.Open();

        var transaction = connection.BeginTransaction();

        var command1 = new SqlCommand("tblOrders_CreateNewOrder", connection, transaction)
                        {
                            CommandType = CommandType.StoredProcedure
                        };
        var command2 = new SqlCommand("tblProducts_RecalculateStock", connection, transaction)
                        {
                            CommandType = CommandType.StoredProcedure
                        };

        try
        {
            command1.ExecuteNonQuery();
            command2.ExecuteNonQuery();
            transaction.Commit();
        }
        catch (Exception ex)
        {
            // Commit failed
            try
            {
                transaction.Rollback();
            }
            catch (Exception ex2)
            {
                // Rollback failed
            }
        }           
    }
}

它允许在第二个sp失败时回滚第一个存储过程的执行。

票数 2
EN

Stack Overflow用户

发布于 2010-07-15 04:05:29

默认情况下,.NET创建一个池SqlConnection。因此,创建新连接(只要它们都使用相同的连接字符串)不会造成开销,直到池完全耗尽。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3252355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档