ASP .NET Core Web Api i Dapper - problem z transakcjami

0

Cześć,

mam dziwny problem w następującym fragmencie kodu:

public async Task<object> Execute(string SQL, object obj, CommandType type)
        {
            SqlConnection connection = new SqlConnection();
            Open(ref connection);


            using (IDbConnection cmd = connection)
            {
                using (var transaction = cmd.BeginTransaction())
                {
                    object id;
                    try
                    {
                        id = await cmd.ExecuteScalarAsync(SQL, obj, commandType: type, transaction: transaction);
                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        Console.WriteLine(ex);
                        return null;
                    }

                    return id;
                }
            }
        }

Przed wykonaniem ExecuteScalarAsync zmienna transaction ma nastepujace wartosci:
screenshot-20210706213208.png

Po przejściu tej linii wszystkie propertiesy są nullami.
W momencie w którym wykonuję transaction.Commit() dostaję This SqlTransaction has completed; it is no longer usable..

Uprzejma prośba o wsparcie, nie mam już pomysłu co się dzieje :(

1

Nie dzieje się tak czasem przez to że przekazujesz transakcje tutaj?

cmd.ExecuteScalarAsync(SQL, obj, commandType: type, **transaction: transaction**)

Spróbuj bez tego ostatnio parametru i zobacz czy coś to zmienia. To wygląda jakby ExecuteScalarAsync wewnętrznie commitowało transakcję, stąd Twój problem. Potrzebujesz przekazywać transakcję to zapytania scalar?

EDIT: A konkretniej- czy w ogóle potrzebujesz transakcję w tym przypadku? Jeśli tak, i okazało się że miałem rację i ExecuteScalarAsync commituje transakcję, to po prostu usuń tę linię kodu:

transaction.Commit();

2

A jaki właściwie SQL wykonujesz?

Oraz co robi Open(ref connection);?

0

Jak Ty w ogóle tworzysz połączenie z sql, jak w sqlconnection nie przekazujesz connectionstringa?
Jakieś cuda robisz w tej metodzie Open? Czemu przekazujesz przez referencje?

Odpaliłem u siebie w projekcie ten kod, bo mam w nim dappera i działa...
Tyle że przekazuje conn string do bazy i otwieram połączenie bez żadnych ceregieli

Raczej problem jest w tej metodzie Open, bo tam chyba cuda się dzieją.
Żeby zreplikować ten Twój błąd, to trzeba wywołać Dispose na SqlConnection zanim wywołane zostanie Commit na transakcji zapiętej do tego połączenia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1