2016-08-26 7 views
0

Я пишу Excel с помощью ExcelDNA и создавая UDF (User-Defined Function).Упаковка нескольких запросов для уменьшения количества подключений к серверу

UDF устанавливает соединение с сервером, и этот сервер подключается к базе данных SQL для извлечения данных и отправки их клиенту.

Однако этот UDF будет называться сотни раз на одном листе.

Я пытаюсь найти способ уменьшить количество запросов на сервер.

По состоянию на данный момент, это то, как шаблон выглядит следующим образом (упрощенный):

ITEM  | JAN 2016 | FEB 2016 | MAR 2016 | 
--------------------------------------------------- 
    ITEM 1 | UDF | UDF | UDF | 
    ITEM 2 | UDF | UDF | UDF | 
    ITEM 3 | UDF | UDF | UDF | 
    ITEM 4 | UDF | UDF | UDF | 
    ITEM 5 | UDF | UDF | UDF | 
    ITEM 6 | UDF | UDF | UDF | 

Итак, прямо сейчас, это будет отправлять запросы 18 в общей сложности.

Я хотел бы, чтобы попытаться уменьшить количество запросов на 6.

так, как я имею в виду, что делать прямо сейчас, что для каждого элемента, в зависимости от того запрос отправляется сначала получить данные для всех месяцев, перечисленных в этом пункте. Тогда второй запрос для того же элемента будет просто ждать результата первого запроса.

Например:

Для ПУНКТА 1 Если UDF в 2016 году колонке JAN вызывается первым, он будет запрашивать данные для всех месяцев ПУНКТА 1, а затем хранить эти данные где-то для других запросов взять из.

Затем, когда приходит второй запрос (скажем, MAR 2016), UDF будет ожидать результат UDF JAN 2016. Таким образом, UDF MAR 2016 не придется запускать другое соединение с сервер.

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

Любые другие решения проблемы также приветствуются.

+0

Рассмотрите возможность удаления тега 'async-await', поскольку он не связан с пакетной обработкой и вашим вопросом в частности. – cassandrad

ответ

0

Асинхронные вызовы не помогут вам сократить количество вызовов, они просто начнут больше параллельных вызовов. Увеличивает ли количество вызовов какие-либо проблемы? Может быть, «лучшие практики» здесь помогут: C# Data Connections Best Practice?

0

Функции Async и дозирование могут помочь вам. В основном вы собираете все запросы, которые хотите сделать в фоновом режиме, в течение короткого периода времени (например, полсекунды), а затем запускаете один вызов на задний план. Когда результат вернется, вы выполните асинхронный вызов для каждого запроса.

Это Gist имеет полную реализацию асинхронные и дозирующие части, вы просто должны поставить функцию пакетной оценки: https://gist.github.com/govert/1bf0a1026ec3aaee19a8

в программе Excel-ДНК группы Google, вероятно, лучше для любых последующих вопросов о данном примере ,