Добрый вечер, возникла задача:

Нужно отфильтровывать SQL-запрос и создавать из него xlsx отчёт.

Фильтрация реализована с помощью хранимой процедуры, в которую из БП передаются значения, выбранные пользователем, но выгрузка в xlsx с помощью ExportToExcel выгружает только esq.

Можно ли как-нибудь перевести StoredProcedure в ESQ? Если нет, то как выгрузить StoredProcedure в xlsx?

 

Нравится

3 комментария

Добрый вечер.

 

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

 

На сторонних ресурсах есть много статей, где подробно описано реализацию такой функции, например, вот одна из них Хранимые функции.

Алла Савельева,

Спасибо. Не подскажите, а как потом хранимую функцию вызвать в БП и передать в esq?

Вашу хранимую процедуру можно реализовать сразу на ESQ, не нужно делать никаких процедур, которые только усложняют жизнь.

И стандартными механизмами работать дальше с ESQ.

Показать все комментарии

Добрый день.

 

Я вызываю хранимую процедуре в коде на C# (см. код ниже), который вызывается бизнес-процессом. Выполнение процедуры в целом длится около 10 минут, но при ее запуске через бизнес-процесс я получаю ошибку System.Data.SqlClient.SqlException (0x80131904): Execution Timeout Expired.

Не подскажете, как в коде на C# установить нужный мне timeout вызова процедуры?

 

StoredProcedure storedProcedure = new StoredProcedure(userConnection,"tsp_GenerateBillingReport");

            storedProcedure.PackageName = userConnection.DBEngine.SystemPackageName;

            storedProcedure.Execute(); 

 

Нравится

2 комментария

Игорь, общий тайм-аут для работы с базой для сайта задаётся в ConnectionStrings.config в свойстве CommandTimeout. А как запустить со своим тайм-аутом конкретный запрос вызова хранимки, см. пример тут:

StoredProcedure storedProcedure = new StoredProcedure(userConnection, "tsp_Test");
storedProcedure.PackageName = userConnection.DBEngine.SystemPackageName;
using (var dbExecutor = userConnection.EnsureDBConnection()) {
   try {
       dbExecutor.CommandTimeout = 0;
       dbExecutor.StartTransaction();
       storedProcedure.Execute(dbExecutor);
       dbExecutor.CommitTransaction();
       return "OK";
   } catch {
       dbExecutor.RollbackTransaction();
       return "NOT OK";
   }
}

0 означает бесконечное ожидание.

Зверев Александр,

 Большое спасибо за Ваш ответ.

Показать все комментарии