Проверка состояния NpgsqlTransaction

Хочу сделать откат вносимых в базу данных изменений с предварительной проверкой, что транзакция открыта.

NpgsqlTransaction tr;


    if (tr != null)
    {
        if (tr.Connection != null)
        {
            tr.Rollback();
            tr.Dispose();
        }
    }

Но если транзакция закрыта, то проверка выдает ошибку

"tr.Connection != null" выдал исключение типа "System.ObjectDisposedException"

на строке

if (tr.Connection != null)

Как можно проверить состояние транзакции?


Ответы (1 шт):

Автор решения: Ingvar

как это делаю я:

/// <summary>
/// Подтверждение изменений, внесенных в БД операторами SQL. Работает только тогда, когда предварительно была открыта транзакция.
/// После подтверждения транзакция закрывается.
/// </summary>
public override void Commit()
{
    if (db == null) { return; };
    if (db.State != ConnectionState.Closed)
    {
        if ((tr != null) && (tr.Connection != null))
        {
            tr.Commit();
            tr.Dispose();
        }
    }
}

UPD: в качестве примера:

using (var tr = db.BeginTransaction())
{
    try
    {
        using (var cm = db.GetSQLCommand("SELECT ......."))
        {
            using (var dr = db.ExecuteReader(cm, tr))
            {
                while (dr.Read())
                {
                    val += $"'test', ";
                }
                dr.Close();
            }
        }
        tr.Commit();
    }
    catch (Exception ex)
    {
        SplashScreenManager.CloseForm(false);
        tr.Rollback();
        Logger.log.Log(Logger.GetErrorInfo(ex, db.GetLastSQL()));
        ServiceWins.ShowError(ex);
        return;
    }
}
db.Close();
→ Ссылка