execute-extended-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 и командами объясняет некоторые детали не в этом ответе.
Ничего себе, я не верил этому сначала. Я удивлен, что 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, в котором Вы нуждались бы.
Объекту команды можно только присвоить объект транзакции использование одного из его конструкторов. Можно пойти для.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.