Как я могу изменить тайм-аут команды адаптера таблицы

Жизнь полна аналогий внедрения зависимости:

  • принтер - картридж
  • цифровое устройство - батарея
  • буква - штамп
  • музыкант - инструмент
  • шина - болезнь драйвера
  • - таблетка
17
задан Flo 5 September 2015 в 15:45
поделиться

3 ответа

Допустим, ваш набор данных называется MySET.
Есть одна таблица под названием MyTable

MySETTableAdapters.MyTableTableAdapter fAdapter = 
   new MySETTableAdapters.MyTableTableAdapter();
fAdapter.Adapter.SelectCommand.CommandTimeout = <fill inyour value here>;
1
ответ дан 30 November 2019 в 12:27
поделиться

В некоторых случаях вы не можете получить доступ к таким элементам, как Adapter в своем классе, поскольку они определены как частные для класса.

К счастью, мастер сгенерирует частичные классы, что означает, что вы можете их расширить. Как описано в [этой ветке Пибальда] [1], вы можете написать свое собственное свойство для установки тайм-аута для команд выбора.

Как правило, вы должны сделать это:

partial class FooTableAdapter
{
  /**
   * <summary>
   * Set timeout in seconds for Select statements.
   * </summary>
   */
  public int SelectCommandTimeout
  {
    set
    {
      for ( int n=0; n < _commandCollection.Length; ++n )
        if ( _commandCollection[n] != null )
          ((System.Data.SqlClient.SqlCommand)_commandCollection[n])
            .commandTimeout = value;
    }
  }
}

Обратите внимание, что я на самом деле не пробовал это сам , но это кажется жизнеспособным решением.

2
ответ дан 30 November 2019 в 12:27
поделиться

С некоторыми небольшими модификациями идея CSL работает отлично.

partial class FooTableAdapter
{
  /**
   * <summary>
   * Set timeout in seconds for Select statements.
   * </summary>
   */
  public int SelectCommandTimeout
  {
    set
    {
            for (int i = 0; i < this.CommandCollection.Length; i++)
                if (this.CommandCollection[i] != null)
                 this.CommandCollection[i].CommandTimeout = value;
    }
  }
}

Использовать его, просто установить this.footableadapter.commandtimeout = 60; где-то до этого .FOOTALLEADAPTER.FILL ();


Если вам нужно изменить тайм-аут на множестве табличных адаптеров, вы можете создать универсальный метод расширения и использовать его отражение для изменения тайм-аута.

/// <summary>
/// Set the Select command timeout for a Table Adapter
/// </summary>
public static void TableAdapterCommandTimeout<T>(this T TableAdapter, int CommandTimeout) where T : global::System.ComponentModel.Component
{                
    foreach (var c in typeof(T).GetProperty("CommandCollection", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Instance).GetValue(TableAdapter, null) as System.Data.SqlClient.SqlCommand[])
        c.CommandTimeout = CommandTimeout;
}

Использование:

this.FooTableAdapter.TableAdapterCommandTimeout(60);
this.FooTableAdapter.Fill(...);

Это немного медленнее. И есть возможность ошибки, если вы используете его по неправильному типу объекта. (Насколько я знаю, нет «тазеадаптера» класса, который вы могли бы ограничить его.)

11
ответ дан 30 November 2019 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: