Кристаллические отчеты - закрывают соединение с базой данных

Когда в документах fullCalendar говорится

API Календаря Google позволяет вам указывать Расширенные свойства для ваших событий. Расширенные свойства будут доступны в виде хеша extendedProperties, который прикреплен к каждому объекту события.

blockquote>

они ссылаются на дополнительные настраиваемые поля, которые вы, возможно, определили в своих событиях Календаря Google - поля, которые не поддерживаются или не предоставляются API Календаря в качестве стандарта. Это поля, которые fullCalendar будет копировать как «дополнительные». не ссылается на «любые поля, которые fullCalendar обычно не считает стандартными».

Теперь, поскольку почти ни одна из структур данных событий, возвращаемых API-интерфейсом «Календарь», не будет отображаться непосредственно в структуру данных, которую fullCalendar требует от вас предоставить для создания допустимого объекта события (см. Список «стандартных» полей fullCalendar в Event Object docs ), мы не можем просто предоставить вывод JSON API-интерфейса Calendar напрямую в fullCalendar и ожидать, что он будет работать и автоматически сопоставлять поля.

Вот почему fullCalendar предоставил файл gcal.js в качестве вспомогательной утилиты для подключения к API, извлечения данных о событии и преобразования его в формат, ожидаемый и понятный для fullCalendar. Очевидно, что разработчики сделали выбор в отношении того, какие области они собираются перенести с одного на другое. Поскольку новый объект создается для передачи в fullCalendar, никакого автоматического сопоставления не существует - все зависит от того, что написано в коде. Обычно, если вы предоставляете JSON для fullCalendar direct, он также копирует любые другие поля, которые он находит в объекте, в дополнение к тем, которые он фактически распознает как «стандартные» (т. Е. Стандартные - те, которые он использует для конкретных целей, как объяснено в документация). Но опять же, поскольку код создает новые объекты для fullCalendar, этого также не происходит.

Кроме примечания о "extendedProperties", нет явной документации о том, какие поля копирует код из вывода API в объекты событий, совместимые с fullCalendar. Быстрый эксперимент с использованием console.log($("#calendar").fullCalendar("clientEvents")); на вашей странице покажет, какими свойствами обладают конечные события, но вы также можете посмотреть исходный код. На момент написания статьи последняя версия fullCalendar v3 была 3.10, а исходный код gcal.js для этой версии (доступен для просмотра здесь ).

Код содержит следующий фрагмент кода для преобразования данных API в объект fullCalendar:

    return {
        id: item.id,
        title: item.summary,
        start: item.start.dateTime || item.start.date,
        end: item.end.dateTime || item.end.date,
        url: url,
        location: item.location,
        description: item.description,
        extendedProperties: extendedProperties
    };

В своих вопросах и комментариях вы упомянули, что вас заинтересуют creator и description поля, которые предоставляет Calendar API. Это стандартные поля в GCal (согласно документам по представлению ресурсов ), и поэтому их не будет в коллекции "extendedProperties". Вы также можете видеть, что description уже скопирован в gcal.js, хотя это не поле, которое обычно использует fullCalendar - тем не менее, оно есть, если вы хотите использовать его в своем календаре.

Поэтому все, что вам нужно сделать, чтобы поле creator (или любое другое поле из свойств GCal) было доступно в ваших событиях fullCalendar, - это включить его в данные, которые копирует gcal.js. например :

    return {
        id: item.id,
        title: item.summary,
        start: item.start.dateTime || item.start.date,
        end: item.end.dateTime || item.end.date,
        url: url,
        location: item.location,
        description: item.description,
        extendedProperties: extendedProperties,
        creator: item.creator
    };

Конечно, если вы включаете gcal.js / gcal.min.js через CDN, вам нужно будет изменить свой код, чтобы вместо него разместить собственную измененную версию.


Кроме того, если вы считаете, что для проекта fullCalendar в целом было бы полезно иметь больше полей из GCal, включенных по умолчанию, то, поскольку fullCalendar является проектом сообщества с открытым исходным кодом, вы можете свободно [ 1111] сделайте запрос функции , чтобы получить изменения, внесенные в утилиту gcal (которая на самом деле является просто дополнительным удобством в качестве слоя между стандартной функциональностью fullCalendar и API Календаря Google), или даже сделайте вклад кода , содержащая предлагаемое изменение, для рассмотрения сопровождающими для включения в основной выпуск. В противном случае вы можете продолжить поддерживать свою модифицированную версию gcal.js или даже полностью заменить ее своей собственной утилитой для взаимодействия с Calendar API.

6
задан Nathan Koop 12 June 2009 в 17:40
поделиться

4 ответа

How are you connecting to the database, by creating your own connection at runtime via setting the authentication or are you letting Crystal do the connection via the stored connection in the report? If you are doing your own connection in any way, shape, or form, you have to manually close the connection and call the dispose before disposing the report.

It is quite possible this is a memory leak. I have experienced these before. There is also a memory leak issue with Crystal Reports and is talked about on their forum quite a bit but no fix was issued when I was using it a few years ago. I ditched Crystal for other options.

1
ответ дан 17 December 2019 в 22:14
поделиться

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

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

0
ответ дан 17 December 2019 в 22:14
поделиться

У меня была та же проблема, за исключением того, что я использую 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();

Марк

0
ответ дан 17 December 2019 в 22:14
поделиться

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

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
ответ дан 17 December 2019 в 22:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: