Kiedy używamy transakcji z System.Transactions (tworzenie TransationScope dla instancji) domyślnie wszystkie połączenia Sql (System.Data.SqlClient.SqlConnection) (ale nie są również prawdziwe dla Oracle.DataAccess.OracleConnection) są wymienione po otwarciu. To się nazywa automatyczna rejestracja. Niezła funkcja. Ale można go wyłączyć za pomocą parametru ciągu połączenia (enlist = false). W takim przypadku otwarte połączenie nie zostanie zarejestrowane. Ale można go później zarejestrować ręcznie. Moje pytanie brzmi: dla pewnej danej instancji SqlConnection, w jaki sposób mogę ustalić, czy to połączenie jest zarejestrowane, czy nie (w System.Transaction). Mogę sprawdzić ciąg połączenia dla parametru. Ale to się nie uda, ponieważ, jak już powiedziałem, połączenie może zostać zarejestrowane ręcznie.Jak ustalić, czy SqlConnection znajduje się w tx System.transactions, czy też nie?
Odpowiedz
Wydaje się, że ramy nie pozwalają na to.
Być może moglibyśmy przedyskutować, dlaczego musisz znać te informacje? Platforma TransactionScopeOptions zapewnia elastyczność podczas tworzenia transakcji.
Jednak odmowa "nie" dla odpowiedzi, małe źródło przeglądania później i stworzyłem ten kod, który działa. Zauważ, że ten kod może przestać działać w dowolnym momencie z łatkami do framework'a !!!!
static bool IsEnlisted(SqlConnection sqlConnection)
{
object innerConnection = typeof(SqlConnection).GetField("_innerConnection", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy).GetValue(sqlConnection);
var enlistedTransactionField =
EnumerateInheritanceChain(innerConnection.GetType())
.Select(t => t.GetField("_enlistedTransaction", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy))
.Where(fi => fi != null)
.First();
object enlistedTransaction = enlistedTransactionField.GetValue(innerConnection);
return enlistedTransaction != null;
}
static IEnumerable<Type> EnumerateInheritanceChain(Type root)
{
for (Type current = root; current != null; current = current.BaseType)
yield return current;
}
Powtórz, to wykorzystuje prywatne i wewnętrzne klasy w ramach .NET. Choć działa dzisiaj, może nie jutro.
+1 za ostrzeżenie "może nie działać jutro". – TcKs
Dzisiaj działa? –
Dzisiaj działa. – TheSoftwareJedi
- 1. Jak ustalić, czy samolot znajduje się w aparacie Three.js Frustum
- 2. Android: jak ustalić, czy wydarzenie dotykowe znajduje się w kręgu?
- 3. Jak ustalić, czy punkt współrzędnych GeoCom znajduje się w granicach
- 4. Jak ustalić, czy ścieżka znajduje się wewnątrz katalogu? (POSIX)
- 5. Jak ustalić, czy ciąg "kończy się" innym ciągiem w R?
- 6. Czy w IDEA znajduje się adnotacja @NonNullByDefault?
- 7. Jak ustalić, czy wymagany moduł pochodzi z klejnotu, czy też był modułem podstawowym?
- 8. Jak ustalić, czy obiekt istnieje w tablicy, czy nie javascript
- 9. Jak ustalić, czy ResultSet jest pusty, czy nie w Javie?
- 10. jest tymczasową wartością l, czy też nie?
- 11. Ustalenie, czy zmienna znajduje się w zasięgu?
- 12. badania, jeżeli argument funkcji znajduje się, czy nie w R
- 13. Szybki sposób ustalania, czy w JPanel znajduje się Componet
- 14. Jak ustalić, czy operacja przeciągania zakończyła się w FireMonkey?
- 15. Jak ustalić, czy strona podręczna jest otwarta, czy nie?
- 16. Jak ustalić, czy wartość pojawia się w GROUP BY grupy
- 17. Jak ustalić, czy pole wyboru DOJO jest zaznaczone, czy nie?
- 18. Jak sprawdzić, czy tekst znajduje się w kolumnie w Kątomierz
- 19. Jak sprawdzić, czy akapit znajduje się w tabeli, czy nie w makrze MS-Word?
- 20. Jak ustalić, czy próba zwróciła błąd, czy nie?
- 21. Określanie, czy pozycja myszy znajduje się w pobliżu krawędzi przeglądarki
- 22. Jak ustalić, czy wiersz tabeli jest widoczny czy nie?
- 23. Jak ustalić, czy GraphicsEnvironment istnieje
- 24. Jak ustalić, czy indeks mysql zmieści się całkowicie w pamięci?
- 25. Czy SqlDataAdapter zamyka funkcję SqlConnection after Fill()?
- 26. Jak ustalić, czy dotknięto UILabel?
- 27. Jena - Jak sprawdzić, czy konkretny zasób znajduje się w modelu?
- 28. C# Jak ustalić, czy HTTPS
- 29. Jak sprawdzić, czy element jQuery znajduje się w DOM?
- 30. Ustal, czy lokalizacja pamięci znajduje się w pamięci podręcznej CPU
Dobre pytanie. Mój scenariusz jest taki, że mam zestaw, który jest tylko kubłem statycznych metod, które biorą otwarty SqlConnection i CRUD na nim. Byłoby miłe, aby wymusić dołączenie SqlConnection do transakcji przed kontynuowaniem, aby pomóc w ochronie przed logicznym uszkodzeniem aplikacji przez osobę dzwoniącą. Możemy wykryć 'Transaction.Current! = Null' i możemy wykryć' SqlConnection conn! = Null', ale nie możemy sprawdzić, czy conn jest zarejestrowany w transakcji. –