Жизнь полна аналогий внедрения зависимости:
Допустим, ваш набор данных называется MySET.
Есть одна таблица под названием MyTable
MySETTableAdapters.MyTableTableAdapter fAdapter =
new MySETTableAdapters.MyTableTableAdapter();
fAdapter.Adapter.SelectCommand.CommandTimeout = <fill inyour value here>;
В некоторых случаях вы не можете получить доступ к таким элементам, как 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;
}
}
}
Обратите внимание, что я на самом деле не пробовал это сам , но это кажется жизнеспособным решением.
С некоторыми небольшими модификациями идея 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(...);
Это немного медленнее. И есть возможность ошибки, если вы используете его по неправильному типу объекта. (Насколько я знаю, нет «тазеадаптера» класса, который вы могли бы ограничить его.)