Sql CommandTimeout установлен для EnterpriseLibrary - PullRequest
1 голос
/ 10 сентября 2010

У меня есть SQL-запрос, который выполняется более 30 секунд. Я знаю, что мне нужно установить CommandTimeout для объекта команды, чтобы преодолеть это. Однако первое место, где встречается объект команды, находится внутри метода «LoadDataSet» внутри библиотеки предприятия.

Не думаю, что я хочу изменить это здесь.

Может кто-нибудь предложить мне подходящее место для его установки?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 10 сентября 2010

Попробуйте это:

dcCommand = dDatabase.GetSqlStringCommand(sSQLCommand);
dcCommand.CommandTimeout = 60;      //**This is the key statement**
dDatabase.LoadDataSet(dcCommand, dsDataSet , saTableNames);

Вместо этого

dDatabase.LoadDataSet(CommandType.Text, sSQLCommand, dsDataSet , saTableNames);
0 голосов
/ 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;
}

Пример.

Database db = EnterpriseLibraryContainer.Current.GetInstance(Of Database)("SmartSoftware");
db.WithCommandTimeOut(0).ExecuteDataSet(CommandType.Text, query);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...