Я могу получить ссылку на отложенную транзакцию от объекта SqlConnection?

  • Mx привязан к команде execute-extended-command , которая позволяет вам вводить имя команды и запускать ее.
  • M-: привязан к command eval-expression , который позволяет вам вводить произвольное S-выражение, содержащее вызовы функций, и оценивает его.
  • Функции, которые вы можете вызвать с помощью M- :, используются для реализации функций Emacs, настроек (например, в вашем .emacs) и плагинов. Функциональные аргументы обычно передаются вызовом функции в S-выражении.

    Любая функция может также быть командой, если она имеет interactive форму в ее определении. Форма interactive описывает, как функция должна получать свои аргументы при вызове в качестве команды. Например, если функция имеет (interactive "bGive me a buffer: ") в своем определении, тогда функция будет вызвана с M-x. Когда пользователь вызывает функцию с помощью Mx, Emacs предложит пользователю имя буфера (из-за b), и имя, которое они набирают, будет передано в качестве аргумента функции.

    Точка создания функции - это упрощение вызова для конечных пользователей, а не только для программистов Emacs Lisp. Команды (запускаются с помощью Mx) проще запускать в интерактивном режиме следующими способами:

    • Вам не нужно окружать имя команды (), чтобы сделать его действительным S-выражением.
    • Аргументы могут передаваться автоматически (например, позиция курсора), или вам может быть предложено их, чтобы вам не приходилось запоминать, какие аргументы необходимы.
    • При запросе аргумента , вы можете автозаполнять его, потому что символы формы .emacs формы .emacs формы (например b) указывают, какой тип ввода ожидать.

    Причина вы не можете вызвать функцию set-face-attribute с Mx, так как ее определение не содержит форму interactive, и поэтому set-face-attribute не является командой. Вы должны назвать это простой функцией в S-выражениях. Вы можете сделать это из минибуфера с помощью M-: или из других мест любым другим способом для оценки кода .


    Emacs Mini Manual → Понятия → Команда имеет короткое, по-разному сформулированное объяснение разницы между нормальными функциями и командами. Связь между функциями Emacs и командами объясняет некоторые детали не в этом ответе.

38
задан Solomon Rutzky 4 January 2019 в 16:12
поделиться

2 ответа

Ничего себе, я не верил этому сначала. Я удивлен, что CreateCommand() не дает команду, это - транзакция при использовании локальных транзакций SQL Server, и что транзакция не представлена на эти SqlConnection объект. На самом деле, когда размышляющий SqlConnection текущая транзакция даже не хранится в том объекте. В реве редактирования я дал Вам некоторые подсказки для разыскивания объекта через некоторые их внутренние классы.

я знаю, что Вы не можете изменить метод, но Вы могли использовать TransactionScope вокруг панели метода? Таким образом, если Вы имеете:

public static void CallingFooBar()
{
   using (var ts=new TransactionScope())
   {
      var foo=new Foo();
      foo.Bar();
      ts.Complete();
   }
}

Это будет работать, я протестировал использующий подобный код к Вашему и как только я добавляю обертку, все хорошо работает, если можно сделать это, конечно. Как указано предостерегитесь, если более тогда одно соединение будет открыто в TransactionScope, то Вы будете наращиваться к Распределенной транзакции, которая, если Ваша система не настроена для них, Вы получите ошибку.

Включение в список с DTC также несколько раз медленнее тогда локальная транзакция.

Редактирование

, если Вы действительно хотите попытаться использовать отражение, SqlConnection имеет SqlInternalConnection, это в свою очередь имеет Свойство AvailableInternalTransaction, который возвращает SqlInternalTransaction, это имеет свойство Родителя, который возвращает SqlTransaction, в котором Вы нуждались бы.

10
ответ дан Lee Taylor 27 November 2019 в 03:55
поделиться

Объекту команды можно только присвоить объект транзакции использование одного из его конструкторов. Можно пойти для.NET 2,0 подхода и использовать объект TransactionScope, который определяется в System.Transactions пространство имен (имеет специализированный блок).

   using System.Transactions;

    class Foo
    {   
        void Bar()
        {
            using (TransactionScope scope = new TransactionScope())
            {
                // Data access
                // ...
                scope.Complete()
            }
        }
    }

Система. Транзакции приближаются к использованию в сочетании с SQL Server 2005 легкий координатор транзакции (LTM). Бойтесь использовать несколько объектов соединения в своей области транзакций, или транзакция будет продвинута, как это замечено, как распределено. Это больше ресурсоемкой версии транзакции будет тогда обработано DTC.

3
ответ дан Leniel Maccaferri 27 November 2019 в 03:55
поделиться