четверг, 27 января 2011 г.

Установка Timeout в сгенерированных DataSet

Добрый день!
В одном из рабочих проектов используем сгенерированные DataSet через XSD-схему, на которую переносятся хранимые процедуры из БД. Как говорится, программа работала отлично до поры до времени. Объем данных вырос и отчеты, использующие эти хранимые процедуры, стали долго строиться (используем ReportViewer) и в конечном итоге вылетать по тайм-ауту. Ясно дело, что надо устанавливать Timeout у SqlConnection. Но лесть в сгенерированный код не хочется, но и не нужно.
Натолкнулся на статью с примером функции расширения:
public static void TableAdapterCommandTimeout(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);
Медленно конечно будет работать, т.к. через рефлексию сделано, но нам быстро и не надо, т.к. отчеты относительно редко используемые. Да и рефлексия в сравнении со временем, которое нужно для построения отчетов, занимает не так уж много времени.

Комментариев нет:

Отправить комментарий

Еще статьи

2leep.com