Прерывистая ошибка Crystal Reports "Запрос не может быть отправлен для фоновой обработки".

Мы работаем с Crystal Reports на Windows Server 2008 с платформой.NET Framework 3.5 SP1.

Я видел много причин общей ошибки "Запрос не может быть отправлен для фоновой обработки". на других форумах, однако, они имеют тенденцию быть постоянными и повторяемыми, затрагивая только один отчет из-за определенной проблемы форматирования с конкретным отчетом.
Мы видим эту ошибку с помощью следующей трассировки стека, периодически.

  • Это влияет на несколько разных отчетов, которые мы имеем.
  • Это влияет на один конкретный отчет чаще, чем другие отчеты.
  • Когда на отчет влияют, одна и та же ошибка часто появляется в нескольких отчетах примерно в одно и то же время, например. в течение следующих 10 минут.
  • Один и тот же отчет, запускаемый с теми же параметрами, может работать при повторном запуске (вскоре после этого), или может потребоваться перезапуск приложения, прежде чем отчет может быть успешно выполнен.

Эти отчеты все работали ранее без проблем. Не видно никаких изменений в сервере или коде, которые могли бы ускорить эту ошибку. Весь код для этого VB.NET

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


"The request could not be submitted for background processing."  
  at CrystalDecisions.ReportAppServer.Controllers.DatabaseControllerClass.ReplaceConnection(Object oldConnection, Object newConnection, Object parameterFields, Object crDBOptionUseDefault)  
  at CrystalDecisions.CrystalReports.Engine.Table.SetDataSource(Object val, Type type)  
  at CrystalDecisions.CrystalReports.Engine.ReportDocument.SetDataSourceInternal(Object val, Type type)  
--- End of inner exception stack trace ---  
  at CrystalDecisions.ReportAppServer.ConvertDotNetToErom.ThrowDotNetException(Exception e)  
  at CrystalDecisions.CrystalReports.Engine.ReportDocument.SetDataSourceInternal(Object val, Type type)  
  at CrystalDecisions.CrystalReports.Engine.ReportDocument.SetDataSource(DataSet dataSet)  
  at "USER CODE"

5 ответов

Решение

Изолировать код генерации отчета.

Наше окончательное решение состояло в том, чтобы взять код, который генерировал отчет, и переместить его в собственный изолированный сервис. Затем наш оригинальный сервис вызывает наш новый сервис Crystal с соответствующими параметрами и файлом Crystal RPT. Это, очевидно, дорогостоящее решение, поскольку оно включает в себя изменение всего кода генерации отчетов для вызова службы Crystal. Служба Crystal не выдает ошибку. Кроме того, код не изменился, поэтому мы можем только предположить, что причиной ошибки было некоторое взаимодействие механизма отчетов Crystal и среды нашего приложения.

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

Дело в том, что CR для VS2008 или более поздних версий не может обрабатывать файлы jpg в режиме CMYK. CR может обрабатывать только jpg файлы в режиме RGB.

Забавно, что более ранние версии CR (та, что шла с VS2003) могли обрабатывать любые jpg-файлы. Спасибо, Кристал.

Для меня проблема была с временным отчетом Crystal, который генерируется в папке TEMP в Windows. Существует ограничение на количество временных отчетов Crystal, которые могут быть сгенерированы механизмом отчетов Crystal при обработке его в цикле. Либо пространство в папке Temp заканчивается из-за нехватки памяти на диске C, либо достигается предел отчетов, после которого отчет за один раз не может экспортировать отчет. Это даст ошибку, упомянутую в вопросе.

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

Решение простое. Всегда закрывайте и удаляйте временный файл Crystal Report.rpt после его экспорта.



    for i as integer=0 to reportcount -1
        Dim rpt as New MyCrystalReport
        Dim filename as String = "MyReport" & i & ".Pdf"
        //Query the DB obtain the dataset then set the datasource to the report
        ...
        //Export the report
       rpt.ExportToDiskCrystalDecisions.Shared.ExportFormatType.PortableDocFormat,fileName)
        rpt.Close()
        rpt.Dispose()
    next

Я тоже столкнулся с такой проблемой, когда понял, что столбец с фотографиями создавал проблему. Выход состоял в том, чтобы преобразовать фотографию (Datatype Image в SQL Server) из набора данных.NET в байтовый и затем сохранить его как Bitmap. После этого этот же BMP-файл можно преобразовать в байты и заменить в соответствующий столбец указанной строки. Благодаря этому пространство значительно сократилось, а затем после экспорта документа отчета и Datatable были правильно удалены.

Есть ли вероятность, что объект отчета просочился в память сервера? Я столкнулся с похожим случаем, когда объект отчета хранился в объекте Session, поэтому отчет не нужно было перезагружать, когда пользователь перемещался между страницами. Однако когда пользователь закончил работу с отчетом, объект остался в сеансе и не был должным образом очищен, когда сеанс был уничтожен сервером. Мне пришлось добавить немного кода в событие Session_End в global.asax, чтобы найти объект отчета и вызвать для него метод dispose.

Тот факт, что это появляется периодически, но затем затрагивает все отчеты в течение 10 минут, заставляет меня думать, что это может быть связано с сеансом. В моей ситуации сервер достиг ограничения по количеству отчетов, которые могут быть созданы на сервере (в памяти), поскольку они не были выпущены. Симптомы были похожи на ваши.

Надеюсь это поможет!

Попробуйте это: если вы оставили какое-либо пустое место в отчете Crystal (заголовок, нижний колонтитул или какие-либо разделы), подавьте его. это все. У меня была эта проблема, и я решил эту проблему.

Другие вопросы по тегам