Что для этого эквивалентно C # 3.0 Linq to SQL?

Старый код 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.


person slf    schedule 10.06.2009    source источник
comment
В основном это зависит от типа транзакции, которую вы пытаетесь совершить. К сожалению, вы не привели достаточно подробностей, чтобы объяснить, чего вы пытаетесь достичь. Если вы создаете новый консольный проект в Visual Studio и добавляете к нему файл Linq-To-Sql, а затем перетаскиваете несколько таблиц из своей базы данных в конструктор, у вас должно получиться хорошее начало. У нас транзакции используются без работы МТС, но мы используем MS SQL Server. Транзакции встроены в .net   -  person Matthew Steeples    schedule 10.06.2009
comment
вы ищете область транзакций?   -  person CodeLikeBeaker    schedule 10.06.2009
comment
в частности, я хочу сопоставить CursorLocation, CursorType и LockType с новыми API. Это может быть дыра для крыс, поскольку настройки по умолчанию, вероятно, в порядке. Я просто хочу избежать глупой ошибки.   -  person slf    schedule 10.06.2009


Ответы (3)


По иронии судьбы ваш VB6 на самом деле немного подозрительный. Когда вы устанавливаете CursorLocation на клиентскую сторону, CursorType не оказывает никакого влияния. Это актуально только для курсоров на стороне сервера.

См. эту статью KB, чтобы доказать, что я говорю не из своей шляпы!

Насколько я понимаю, запросы LinqToSQL приносят все данные клиенту. Они вообще не используют серверные курсоры. Следовательно, поведение LINQ должно быть таким же, как у вашего кода VB6. Единственное, на что вы, возможно, захотите обратить внимание, - это то, что в ADO есть способ контролировать, как оптимистическая блокировка обнаруживает конфликты обновлений. Вы можете использовать метку времени, измененные поля или все поля. Я не уверен, как LINQ обрабатывает конфликты обновлений.

person Darrel Miller    schedule 13.06.2009

Для использования 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();
   }
}
person EPiddy    schedule 10.06.2009

DataContext поставляется с конструктором, который принимает соединение. Я думаю, вы можете управлять своей транзакцией так же, как и раньше.

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

Если вы предоставите открытое соединение, DataContext не закроет его. Поэтому не создавайте экземпляр DataContext с открытым соединением, если у вас нет для этого веской причины.

Кроме того, мы использовали System.Transactions без координатора распределенных транзакций. Это необходимо только в том случае, если ваша транзакция охватывает несколько серверов баз данных (несколько соединений).

person Amy B    schedule 10.06.2009