什么是相同的C#3.0 Linq to SQL?

时间:2009-06-10 16:44:38

标签: linq linq-to-sql vb6 c#-3.0 transactions

需要转换的旧VB6代码:

'DB Connection
Set Conn = New ADODB.Connection
Conn.ConnectionString = sConn
Conn.Open sConn
Conn.BeginTrans

'Recordset
Set rsPrice = New ADODB.Recordset
rsPrice.CursorLocation = adUseClient
rsPrice.CursorType = adOpenKeyset
rsPrice.LockType = adLockBatchOptimistic
rsPrice.ActiveConnection = Conn

在C#.NET 3.5 Linq to SQL中,这相当于什么呢?我记得在某个地方读过使用System.Transactions需要在后端使用MTS,但是今天早上我的记忆很模糊。

修改

我找不到CursorLocation,CursorType和LockType与新API的直接匹配,这是我困惑的根源。我熟悉TransactionScope,但我不知道TransactionScope的默认值是否可以接受,或者我是否因为信任它而犯了一个骨头错误。该数据库是SQL Server 2005。

3 个答案:

答案 0 :(得分:1)

使用System.Transactions需要MSDTC(Microsoft分布式事务控制器)而不是MTS。

如果您可以吞下这个要求,那么您可以这样做:

using (System.Transactions.TransactionScope scope = new
System.Transactions.TransactionScope())
{
   try
   {
      //todo: do your linq to sql here

      //commit it, everything is successfully done!
      scope.Complete();
   }
}

答案 1 :(得分:1)

DataContext附带一个接受连接的构造函数。我认为您可以管理以前管理过的交易。

http://msdn.microsoft.com/en-us/library/bb292288.aspx

  

如果提供打开的连接,DataContext将不会关闭它。因此,除非您有充分的理由这样做,否则不要使用打开的连接实例化DataContext。

此外,我们使用了没有分布式事务处理协调器的System.Transactions。如果您的事务涵盖多个数据库服务器(多个连接),则只需要这样做。

答案 2 :(得分:1)

具有讽刺意味的是你的VB6实际上有点怀疑。当您将CursorLocation设置为Client-side时,CursorType没有任何影响。它仅与服务器端游标相关。

请参阅this KB文章,以证明我不是在说话!

我的理解是LinqToSQL请求将所有数据带到客户端。它们根本不使用服务器端游标。因此,LINQ的行为应该与VB6代码相同。您可能想要研究的唯一事情是ADO中有一种方法可以控制乐观锁定如何检测更新冲突。您可以使用时间戳,更改的字段或所有字段。我不确定LINQ如何处理更新冲突。