Корпоративная библиотека 5.0 и время ожидания команды
Я использую следующий код и хочу знать, требуется ли нам установить таймаут команды при использовании CreateSprocAccessor библиотеки enterprise, если нет, то как таймаут управляется?
var accessor = _sqlDatabase.CreateSprocAccessor<xyz>("uspGetxyz",
new xyzParameters(_sqlDatabase),
MapBuilder<xyz>.MapAllProperties().Build());
//Execute the accessor to obtain the results
var Data = accessor.Execute();
xyzList = Data.ToList<xyz>();
5 ответов:
Я не могу поверить в то, что команда enterprise library допустила ошибку, они не дали никакого способа установить время ожидания команды в случае доступа, это проблема know с ними http://entlib.codeplex.com/workitem/28586 не могу в это поверить, я разработал целый проект и только что узнал эту проблему ноу: - (wtf
Я начал использовать Microsoft Enterprise Library давно, где в обычном случае вызов операции DB с использованием предоставленных методов класса "Database" выполняет свою потребность. В некоторых случаях для длительного выполнения запроса разработчик хочет задать свойство CommandTimeout класса SqlCommand (или DbCommand). Это позволит выполнять запрос длительное время в качестве значения, заданного в таймауте команды.
По умолчанию прикладной блок доступа к данным не поддерживает / принимает простой параметр CommandTimeout в вызовах методов (есть много примеров обходных путей, доступных в сети). Чтобы добиться того же с минимальными изменениями, я добавил простую функцию с именем "WithCommandTimeOut", принимающую параметр timeOutSecond в "Microsoft.Практика.EnterpriseLibrary.Данные.Класс "Database", который возвращает тот же экземпляр класса "Database". Смотрите обновленный фрагмент кода ниже для изменений кода. Надеюсь, это решит проблему тайм-аута.
//Class Level Static Variables //Used to reset to default after assigning in "PrepareCommand" static method static int DEFAULT_COMMAND_TIMEOUT_RESET = 30; //Default value when "WithCommandTimeOut" not called static int COMMAND_TIMEOUT_FOR_THIS_CALL = DEFAULT_COMMAND_TIMEOUT_RESET; public Database WithCommandTimeOut(int timeOutSeconds) { COMMAND_TIMEOUT_FOR_THIS_CALL = timeOutSeconds; return this; } protected static void PrepareCommand(DbCommand command, DbConnection connection) { if (command == null) throw new ArgumentNullException("command"); if (connection == null) throw new ArgumentNullException("connection"); //Here is the magical code ---------------------------- command.CommandTimeout = COMMAND_TIMEOUT_FOR_THIS_CALL; //Here is the magical code ---------------------------- command.Connection = connection; //Resetting value to default as this is static and subsequent //db calls should work with default timeout i.e. 30 COMMAND_TIMEOUT_FOR_THIS_CALL = DEFAULT_COMMAND_TIMEOUT_RESET; }
Исх. База данных db = EnterpriseLibraryContainer.Текущий.GetInstance(Of База Данных) ("SmartSoftware"); дБ.WithCommandTimeOut(0).ExecuteDataSet (CommandType.Текст, запрос);