Как использовать транзакцию с типизированным набором данных в C #? - PullRequest
3 голосов
/ 23 марта 2011

Привет Как я могу использовать транзакцию с набранным набором данных? Допустим, у меня есть таблица записей и таблица подробностей записи, и я должен сохранить одну в таблице записей и все детали в таблице подробностей записи. Как я могу использовать? Я обнаружил, что транзакция может использоваться с нетипизированным набором данных, но я не вижу ее с типизированным набором данных. Может кто-нибудь сказать мне, как я должен делать?

Kevin

Ответы [ 3 ]

5 голосов
/ 23 марта 2011

В CodeProject есть хорошая статья (и код) о том, как расширить набор типизированных данных для включения транзакций, не переводя их в распределенную транзакцию при использовании TransactionScope.

Резюме: Используйте область транзакции с методом, добавленным в частичный класс, чтобы изменить базовые объекты SqlCommand для участия в той же транзакции.

using (SqlTransaction transaction = connection.BeginTransaction())
{
       // These methods will update all relevant command objects’ transaction property
       adapter1.EnlistTransaction(transaction);
       adapter2.EnlistTransaction(transaction);

       adapter1.Update(table1);
       adapter2.Update(table2);

       transaction.Commit();
}

Пример кода для адаптера из справочника:

public partial class [TableAdapterName]
{
    public void EnlistTransaction(System.Data.SqlClient.SqlTransaction transaction)
    {
        System.Data.SqlClient.SqlTransaction _transaction;

        if (this._transaction != null)
        {
            throw new System.InvalidOperationException
        ("This adapter has already been enlisted in a transaction");
        }
        else
        {
            this._transaction = transaction;
            Adapter.UpdateCommand.Transaction = _transaction;
            Adapter.InsertCommand.Transaction = _transaction;
            Adapter.DeleteCommand.Transaction = _transaction;
        }
    }
}
1 голос
/ 02 февраля 2018

Я не рекомендую использовать транзакцию, поскольку она трудна для обработки рефакторинга кода, так как вы можете обернуть огромное количество кода, вот как я рекомендую:

Этот ответ отличается, поскольку он добавляет транзакциювсе команды и не только для постоянства

Расширение вашего частичного класса адаптера:

partial class YourTableAdapter
{
    public SqlTransaction Transaction
    {
        set
        {
            if (this.CommandCollection != null)
            {
                for (int i = 0; i < this.CommandCollection.Length; i++)
                {
                    this.CommandCollection[i].Connection = value.Connection;
                    this.CommandCollection[i].Transaction = value;
                }
            }

            this.Connection = value.Connection;
            this._adapter.AplicaTransaction(value);
        }
    }
}

Метод расширения:

namespace System
{
    public static class DALSqlExtension
    {
        public static void AplicaTransaction(this SqlDataAdapter _adapter, SqlTransaction transaction)
        {
            if (_adapter == null)
            {
                return;
            }
            if (_adapter.InsertCommand != null)
            {
                _adapter.InsertCommand.Transaction = transaction;
                _adapter.InsertCommand.Connection = transaction.Connection;
            }
            if (_adapter.UpdateCommand != null)
            {
                _adapter.UpdateCommand.Transaction = transaction;
                _adapter.UpdateCommand.Connection = transaction.Connection;
            }
            if (_adapter.DeleteCommand != null)
            {
                _adapter.DeleteCommand.Transaction = transaction;
                _adapter.DeleteCommand.Connection = transaction.Connection;
            }
            if (_adapter.SelectCommand != null)
            {
                _adapter.SelectCommand.Transaction = transaction;
                _adapter.SelectCommand.Connection = transaction.Connection;
            }
        }
    }
}
1 голос
/ 23 марта 2011

Вы можете использовать TransactionScope и вызывать оба обновления в рамках объекта TransactionScope.

Смотрите пример, приведенный в этой ссылке. TransactionScope .

Более подробный пример приведен здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...