1

Linq2Sql 不支持存储过程(12)的表值参数。

因此,我在我的 DataContext 中添加了对表值参数的丑陋支持(只是为了保持一致并且仍然能够从相同的数据上下文中调用我的过程)。

我调用this.Connection.CreateCommand(),将其转换为SqlCommand(因为SqlCommand无论如何它都将支持 TVP),手动列出所有参数,包括参数SqlDbType.StructuredExecuteNonQuery它。

这工作正常。
但。
在我的辅助方法中,我必须打开上下文连接,因为它可能已关闭。因为我手动打开连接,我必须手动关闭它吗?

我经历过这些:
如果我使用 Linq,是否必须手动关闭 SQL 连接?
我应该何时处理数据上下文
如果我使用 DataContext,何时开始与数据库的连接?

但他们实际上并没有回答我的问题。我知道在枚举结果时连接已关闭,但它比这更复杂。与枚举结果相反,调用方法不是只读操作。
此外,如果有环境事务,DataContext在第一次方法调用后肯定不会关闭连接:

using (var ambient_tran = new System.Transactions.TransactionScope())
{
    using (var dx = new SomeDataContext()) 
    {
        dx.CallMethodOne(foo, bar);
        dx.CallMethodTwo(bar, baz); // executed on same connection and same transaction,
                                    // can see uncommitted data entered by CallMethodOne
    }

    ambient_tran.Complete();
};

由于这一切,我不确定在连接方面做什么是正确的。
我只是打开连接并离开DataContext管理它的生命周期,还是有一个模式可以遵循?


编辑:

实验表明,如果我让它保持打开状态,它会表现良好并自动尊重环境事务(如果有)。但是,我更喜欢对此提出可靠的建议。

4

1 回答 1

-1

如果您不需要分布式事务,请避免使用 System.Trasactions。相反,请参阅我的TextMetal项目、示例代码,并注意 Plumbing 命名空间。如果您有任何问题,请给我发电子邮件。无需 MSDTC,只需正确生成 ADO.NET/LINQ to SQL、工作单元模式和一些精心设计的数据访问代码!

如果使用 System.Transactions 有令人信服的理由,那么我建议您仍然尽快关闭连接,因为事务协调器将在连接释放到池后管理提交/回滚。

于 2012-09-13T15:07:00.580 回答