在DataContext中手动打开连接时要遵循的模式

时间:2012-01-13 13:42:10

标签: c# .net linq-to-sql ado.net table-valued-parameters

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

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

我致电this.Connection.CreateCommand(),将其投放到SqlCommand(因为无论如何它都会SqlCommand支持TVP),手动列出所有参数,包括SqlDbType.Structured个参数,和ExecuteNonQuery它。

这很好用 但是,
在我的帮助方法中,我必须打开上下文连接,因为它可能已关闭。 因为我手动打开连接,是否必须手动关闭它?

我经历过这些:
Do I have to close the SQL Connection manually if I use Linq?
When should I dispose of a data context
When the connection to database starts if i use 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管理其生命周期,或者是否有可以遵循的模式?


修改

实验表明,如果我只是将其打开,它表现良好并自动尊重环境事务(如果有的话)。但是,我更希望得到一个可靠的建议。

1 个答案:

答案 0 :(得分:-1)

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

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