Enterprise Library 5.0 и время ожидания команды - PullRequest
2 голосов
/ 17 мая 2011

Я использую следующий код и хочу знать, требуется ли нам устанавливать время ожидания команды при использовании CreateSprocAccessor библиотеки предприятия, если нет, то каким образом осуществляется управление временем ожидания?

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 ]

2 голосов
/ 09 ноября 2011

Я давно начал использовать Microsoft Enterprise Library, где в обычном случае вызовы операций БД с использованием предоставленных методов класса «База данных» удовлетворяют потребности.В некоторых случаях для длительного выполнения разработчик хочет установить свойство CommandTimeout класса SqlCommand (или DbCommand).Это позволит выполнять запрос длительное время в качестве значения, установленного в тайм-ауте команды.

По умолчанию блок приложения доступа к данным не поддерживает / не принимает простой параметр CommandTimeout в вызовах методов (в сети доступно много примеров обходных путей).Чтобы добиться того же с минимальными изменениями, я добавил простую функцию с именем «WithCommandTimeOut», принимающую параметр timeOutSecond в классе «Microsoft.Practices.EnterpriseLibrary.Data.Database.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.Current.GetInstance (Of Database) («SmartSoftware»);db.WithCommandTimeOut (0) .ExecuteDataSet (CommandType.Text, query);

2 голосов
/ 18 мая 2011

Я не могу поверить в то, что сделала грубая команда корпоративных библиотек, они не дали никакого способа установить время ожидания команд в случае Accessor, это известная проблема с ними http://entlib.codeplex.com/workitem/28586 Не могу поверить, я разработал целый проект и только что узнал об этом известной проблеме :-( wtf

1 голос
/ 30 октября 2014

Мы можем обновить это в строке подключения, увеличить время ожидания подключения = 1000;

1 голос
/ 02 октября 2012

Вы можете изменить DbCommand тайм-аут в вашем xyzParameters классе в AssignParameters метод:

public void AssignParameters(
  System.Data.Common.DbCommand command, object[] parameterValues)
  {
    command.CommandTimeout = 0;
    ...
  }
0 голосов
/ 20 мая 2011

Volla !!! я внес изменения в исходный код библиотеки Enterprise, добавил новый метод execute, который будет принимать параметр timeOut, в классе доступа Sproc и использовал эти двоичные файлы в своем проекте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...