Как определить, включается ли SqlConnection в список в Систему. tx транзакций или нет?

Вы можете сделать это только с одним элементом и некоторым фоном:

.box {
  padding:20px;
  margin:0 60px;
  border-radius:20px;
  border:2px solid green;
  display:inline-block;
  position:relative;
}
.box::before {
  content:"";
  position:absolute;
  z-index:-1;
  left:-50px;
  right:-50px;
  height:20px;
  top:calc(50% - 10px);
  background:
    /*arrow*/
    linear-gradient(to bottom right,green 49%,transparent 52%) bottom right/15px 50%,
    linear-gradient(to top right,green 49%,transparent 52%) top right/15px 50%,
    /*circle*/
    radial-gradient(green 56%,transparent 60%) -2px 50%/20px 20px, 
    /*line*/
    linear-gradient(green,green) right center/50px 2px,
    linear-gradient(green,green) left center /50px 2px;
  background-repeat:no-repeat;
}
<div class="box">Some text</div>

5
задан Shrike 14 October 2008 в 03:35
поделиться

1 ответ

Платформа, кажется, не позволяет это.

Возможно, мы могли обсудить, почему необходимо знать эту информацию? TransactionScopeOptions дают Вам некоторую гибкость о том, когда создать транзакции.

Однако отказываясь от "нет" для ответа, немного источника, просматривающего позже и я создал этот код, который ДЕЙСТВИТЕЛЬНО работает. Обратите внимание на то, что этот код мог прекратить функционировать в любое время с патчами к платформе!!!!

    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;
    }

Снова, это использует частные переменные и внутренние классы в платформе.NET. В то время как это работает сегодня, это не может завтра.

9
ответ дан 14 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: