需要转换的旧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。
答案 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如何处理更新冲突。