Crystal Reports - закрыть соединение с базой данных - PullRequest
6 голосов
/ 07 апреля 2009

Это в C #, Visual Studio 2008, Crystal Reports, поставляемый с VS2008

У меня есть форма просмотра отчетов Crystal, которая находится в DLL. DLL отвечает за загрузку отчета Crystal (на основе имени файла отчета) и отображение отчета в форме.

Когда я закончу с отчетом Crystal, я вызываю dispose для загруженного объекта reportdocument. Однако соединение с базой данных остается.

Похоже, Crystal обнаруживает, что существуют другие соединения (из моего основного приложения) с той же базой данных, и сохраняет свое соединение открытым. Кристаллическое соединение закрывается при закрытии соединения с базой данных основных приложений.

Есть ли способ заставить кристалл закрыть свое соединение, не закрывая соединение с базой данных основных приложений?

Ответы [ 4 ]

1 голос
/ 21 апреля 2009

Как вы подключаетесь к базе данных, создавая собственное соединение во время выполнения с помощью настройки аутентификации, или вы разрешаете Crystal выполнить подключение через сохраненное соединение в отчете? Если вы создаете собственное соединение каким-либо образом, в какой-либо форме или форме, вам нужно вручную закрыть соединение и вызвать утилиту удаления перед удалением отчета.

Вполне возможно, что это утечка памяти. Я испытал это раньше. Существует также проблема утечки памяти в Crystal Reports, о которой довольно часто говорят на их форуме, но я не использовал ее несколько лет назад. Я бросил Кристалл для других вариантов.

0 голосов
/ 08 декабря 2009

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

ReportDocument rd = (ReportDocument) viewer.ReportSource;
foreach (Table table in rd.Database.Tables)
    table.Dispose();
viewer.ReportSource = null;
rd.Database.Dispose();
rd.Close();
rd.Dispose();
rd = (ReportDocument) viewer.ReportSource;  
GC.Collect();

Это не полностью исключило утечку, но, безусловно, помогло.

0 голосов
/ 19 мая 2009

У меня была такая же проблема, за исключением того, что я использую Sybase. Некоторое время назад я публиковал код, который написал, чтобы избавиться от соединения (и это не сработало), когда увидел ошибку! Я исправил ошибку и, скрестив пальцы, теперь, похоже, работает. Я открыл почти 100 отчетов, где я не мог открыть 10 раньше. Если вы попробуете это, пожалуйста, дайте мне знать, если это работает для вас.

Вот что я делаю прямо перед тем, как закрыть окно, содержащее средство просмотра Crystal Reports:

var rd = (ReportDocument)crystalReportViewer1.ReportSource;
foreach (Table table in rd.Database.Tables)
   table.Dispose();
rd.Database.Dispose();
rd.Close();
rd.Dispose();
GC.Collect();

Mark

0 голосов
/ 07 апреля 2009

Я не слишком знаком с Crystal Reports, но есть много объектов, которые имеют бесполезный метод Dispose () из-за цепочки наследования, включающей интерфейс IDisposable. Если вы не видите проблем с производительностью на сервере, не беспокойтесь об этом. GC позаботится о соединениях на клиентах, когда он будет готов. Вы не должны пытаться быть умнее, чем GC, у вас будет только больше головной боли.

И всегда вызывайте Dispose () (или используйте {}), когда он доступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...