none
Медленная загрузка данных из SQL Server в приложение RRS feed

  • Вопрос

  • SQL Server 2008. Есть хранимая процедура, в ней элементарный запрос типа

    SELECT userid, username, FROM TABLE1;

    Процедура возвращает порядка 30000 записей, отрабатывает меньше чем за секунду.

    Результаты нужно в приложении поместить в ComboBox. (Visual Studio 2008, WPF)

    Проблема в том что в первый раз времы до открытия комбобокса составляет 20- 30 секунд, что недопустимо долго. Если комбобокс закрыть и открыть снова - уже секунды 3.

     

    Биндинг делаю так

     

    WPF

                        <ComboBox SelectedValuePath="UserID" HorizontalAlignment="Left" Margin="85,6,0,0" Name="ComboBox" Width="228.55" ItemsSource="{Binding}" DisplayMemberPath="UserName" Height="23.04" VerticalAlignment="Top">

     

    C#

    //Загружаем данные в комбобокс "Пользователи"
            daUsers.Fill(dsUsers.sp_getUsers);
    
            this.ComboBox.DataContext = dsUsers.sp_getUsers.DefaultView;

     

     

    В чем может быть причина столь долгого выполнения?

     

     

    Спасибо

    • Перемещено I.Vorontsov 13 мая 2010 г. 7:02 (От:Visual C#)
    • Перемещено I.Vorontsov 13 мая 2010 г. 8:45 (От:SQL Server для разработчиков)
    • Перемещено Tagore Bandlamudi 1 октября 2010 г. 21:59 MSDN Forums consolidation (От:Visual C#)

Ответы

  • Замени стандартный контейнер в ComboBox на VirtualizingStackPanel

    <ComboBox ......>
    
    <ComboBox.ItemsPanel>
     <ItemsPanelTemplate>
      <VirtualizingStackPanel />
     </ItemsPanelTemplate>
    </ComboBox.ItemsPanel>
    
    …
    </ComboBox>

    • Предложено в качестве ответа Mike_MsLive 13 мая 2010 г. 9:17
    • Помечено в качестве ответа I.Vorontsov 14 мая 2010 г. 5:28

Все ответы

  • Попробуй:
     
    this.ComboBox.SuspendLayout();
    daUsers.Fill(dsUsers.sp_getUsers);
    this.ComboBox.DataContext = dsUsers.sp_getUsers.DefaultView;
    this.ComboBox.ResumeLayout();
     
    Модератор
  • А почему вопрос по C# переместили в раздел по SQL Server?

     

     

    2 ulcer - а  SuspendLayout() в WPF будет работать? Я так понял что это только для WinForms.

  • 2 ulcer - а SuspendLayout() в WPF будет работать? Я так понял что это > только для WinForms.
     
    Виноват. Не будет.

    Видимо надо как то так:
    this.Dispatcher.BeginInvoke(new Action(() =>
    this.ComboBox.DataContext = dsUsers.sp_getUsers.DefaultView), DispatcherPriority.Render);
    
    Хотя и так особого прироста производительности не получается добиться...
    Модератор
  • this.Dispatcher.BeginInvoke(new Action(() =>

    this.ComboBox.DataContext = dsUsers.sp_getUsers.DefaultView), DispatcherPriority.Render);

     

    что-то здесь не то со скобками=(

    Главное что я не понимаю в чем имено суть проблемы. До dataset данные как мне кажется доходят быстро  (как бы это проверить), а вот открытие комбобокса тормозит.

  • А почему вопрос по C# переместили в раздел по SQL Server?

    2 ulcer - а  SuspendLayout() в WPF будет работать? Я так понял что это только для WinForms.

    По запарке, переместил назад.

    Для связи [Mail]
  • Замени стандартный контейнер в ComboBox на VirtualizingStackPanel

    <ComboBox ......>
    
    <ComboBox.ItemsPanel>
     <ItemsPanelTemplate>
      <VirtualizingStackPanel />
     </ItemsPanelTemplate>
    </ComboBox.ItemsPanel>
    
    …
    </ComboBox>

    • Предложено в качестве ответа Mike_MsLive 13 мая 2010 г. 9:17
    • Помечено в качестве ответа I.Vorontsov 14 мая 2010 г. 5:28
  • что-то здесь не то со скобками=(

    Не обращай внимания. Это меня не туда понесло совсем

     
    Модератор
  • Спасибо, VirtualizingStackPanel помогла решить проблему. А в чем высший смысл таких манипуляций?
  • По умолчанию в шаблоне стоит обычный StackPanel. При открытии создаются сразу все Item-ы в комбобоксе. При виртуализации - создаются только видимые, что намного быстрее. В msdn по VirtualizingStackPanel подробно расписано.