Корпоративная библиотека 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 2

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.Текст, запрос);

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

public void AssignParameters(
  System.Data.Common.DbCommand command, object[] parameterValues)
  {
    command.CommandTimeout = 0;
    ...
  }

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

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