Я давно начал использовать 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);