Использование в отчётах подключения приложения
CanSee
Кировская область, Киров
Здравствуйте.
Есть приложение для разработки отчётов. Задача приложения - соединяться с БД, загружать оттуда хранящиеся в определённой таблице отчёты и передавать их компонентам FastReport для обработки или вывода. После обработки, принимать от FastReport новые или изменённые отчёты и сохранять их в БД. Загрузка/сохранение сделано по инструкциям, работает. Но хотелось бы, чтобы в FastReport можно было использовать подключение к БД, которое устанавливается при запуске приложения, и только его. В инструкциях на эту тему нашёл только топик "Передача строки подключения в отчёт". В крайнем случае, придётся так и делать, но хотелось бы кое-что несколько другое. В связи с этим, возникают следующие вопросы.
1. При любых операциях с отчётами в приложении уже есть открытый экземпляр SqlConnection (System.Data.SqlClient.SqlConnection). Логично было бы использовать этот компонент и в отчёте. Есть ли какая-то возможность передачи SqlConnection в отчёт и использования его там? Если нет - то планируется ли добавить такую возможность в будущем? Если да, то примерно к какому сроку?
2. В приложении любой новый отчёт должен работать как раз с той базой данных, к которой уже подключено приложение. Однако, чтобы получить доступ к БД из дизайнера в новом, только что созданном отчёте, пользователю нужно создать подключение, указать строку подключения и т.д. Можно ли сделать так, чтобы при создании отчёта и открытии его в дизайнере в нём уже имелось созданное подключение к БД, к которой уже подключено приложение? Регистрация набора данных (Dataset) приложения не подходит - нужен не Dataset приложения, а именно подключение к базе данных. Такое, которое создаётся при выборе в окне "Данные" действия "Новый источник данных" и настройке подключения к БД SQL Server. Которое позволяло бы пользователю просматривать, какие объекты есть в БД, писать собственные SQL-запросы и т.д. Есть ли какая-то возможность добавить такое подключение при создании нового отчёта программным путём, из кода? Я попытался разобраться, сделав такой источник данных вручную, а потом получив доступ к нему в коде с помощью Report.GetDataSource(). Но ничего не получилось - GetDataSource в этом случае возвращает null, хотя алиас источника данных указан правильно.
3. Нужно, чтобы отчёты сохранялись в БД/файлах без какой-либо информации о подключении. Есть ли какая-то возможность автоматически очищать сохранённую в отчётах информацию о подключении к БД из кода приложения?
4. Возможно ли запретить пользователям использовать другие подключения, кроме подключения к БД, к которой подключено приложение, в дизайнере и при выводе отчёта? Иначе получается, что в комплекте с распространяемой системой поставляется не приложение для анализа данных этой системы, а универсальный построитель отчётов для работы с любой базой данных.
Есть приложение для разработки отчётов. Задача приложения - соединяться с БД, загружать оттуда хранящиеся в определённой таблице отчёты и передавать их компонентам FastReport для обработки или вывода. После обработки, принимать от FastReport новые или изменённые отчёты и сохранять их в БД. Загрузка/сохранение сделано по инструкциям, работает. Но хотелось бы, чтобы в FastReport можно было использовать подключение к БД, которое устанавливается при запуске приложения, и только его. В инструкциях на эту тему нашёл только топик "Передача строки подключения в отчёт". В крайнем случае, придётся так и делать, но хотелось бы кое-что несколько другое. В связи с этим, возникают следующие вопросы.
1. При любых операциях с отчётами в приложении уже есть открытый экземпляр SqlConnection (System.Data.SqlClient.SqlConnection). Логично было бы использовать этот компонент и в отчёте. Есть ли какая-то возможность передачи SqlConnection в отчёт и использования его там? Если нет - то планируется ли добавить такую возможность в будущем? Если да, то примерно к какому сроку?
2. В приложении любой новый отчёт должен работать как раз с той базой данных, к которой уже подключено приложение. Однако, чтобы получить доступ к БД из дизайнера в новом, только что созданном отчёте, пользователю нужно создать подключение, указать строку подключения и т.д. Можно ли сделать так, чтобы при создании отчёта и открытии его в дизайнере в нём уже имелось созданное подключение к БД, к которой уже подключено приложение? Регистрация набора данных (Dataset) приложения не подходит - нужен не Dataset приложения, а именно подключение к базе данных. Такое, которое создаётся при выборе в окне "Данные" действия "Новый источник данных" и настройке подключения к БД SQL Server. Которое позволяло бы пользователю просматривать, какие объекты есть в БД, писать собственные SQL-запросы и т.д. Есть ли какая-то возможность добавить такое подключение при создании нового отчёта программным путём, из кода? Я попытался разобраться, сделав такой источник данных вручную, а потом получив доступ к нему в коде с помощью Report.GetDataSource(). Но ничего не получилось - GetDataSource в этом случае возвращает null, хотя алиас источника данных указан правильно.
3. Нужно, чтобы отчёты сохранялись в БД/файлах без какой-либо информации о подключении. Есть ли какая-то возможность автоматически очищать сохранённую в отчётах информацию о подключении к БД из кода приложения?
4. Возможно ли запретить пользователям использовать другие подключения, кроме подключения к БД, к которой подключено приложение, в дизайнере и при выводе отчёта? Иначе получается, что в комплекте с распространяемой системой поставляется не приложение для анализа данных этой системы, а универсальный построитель отчётов для работы с любой базой данных.
Комментарии
В отчёте программным путём, как показано в инструкции, создаю параметр, в который передаю строку подключения из своего приложения. Параметр пишу в свойство "ConnectionStringExpression" объекта "Подключение" в окне "Данные". При выводе отчёта на просмотр всё нормально. А вот в дизайнере параметр игнорируется, и если у объекта подключения стёрта строка подключения - дизайнер падает с ошибкой. При этом все изменения в отчёте пропадают.
Можно ли как-то сделать так, чтобы параметр мог использоваться как значение строки подключения и в дизайнере тоже?
По первому сообщению: это можно реализовать, но не совсем удобно. Я доработаю код в соответствии с этим сценарием работы (это займет немного времени - к началу следующей недели будет готово).
По второму: в design-time вычисление выражений невозможно - для этого требуется компиляция отчета. Используйте другой способ передачи строки подключения.
Насчёт использования другого способа подключения. Выбор вариантов тут небогат В топике "Передача строки подключения" их описано всего два, и способ с передачей параметра не подходит. Попробовал второй, с использованием события подключения к БД - тоже пока ничего не получилось. Несмотря на то, что в обработчике события назначается строка подключения, при очистке строки подключения и попытке отредактировать источник данных дизайнер всё так же сваливается с той же самой ошибкой.
Остаётся только ждать реализации новой схемы работы
AlexTZ, в связи с этим в текущей версии лично меня всё устраивает, и для меня делать ничего не нужно. Но если сделаете - не откажусь от новой версии В любом случае, спасибо за быстрый отклик и помощь
Делается так. Надо написать свой класс подключения. Написание класса оказалось делом очень простым - почти всё передрано из инструкции, благо там приведены примеры для MS SQL Server. Осталось только убрать ненужное.
Получилось хорошо - пользователю нужно только создать новый источник данных класса "Подключение редактора" без указания каких-либо параметров, и он сразу же получает готовое настроенное подключение к БД. При этом строка подключения нигде не показывается И не сохраняется
Ниже привожу код - кому надо, пользуйтесь. Вставляем код класса подключения куда-нибудь в файл кода приложения, а потом после соединения приложения с БД регистрируем свой класс подключения: Также пришлось определить свой редактор подключения, который ничего не редактирует и не показывает никаких контролов. Делается он просто - добавляем в проект новый UserControl (обычный, а не наследованный от FastReport. Наследование проще добавляется вручную). Потом в дизайнере ставим ему размер по вертикали 1, по горизонтали - 316. Потом меняем его код на приведённый ниже - и всё готово
Остались мелочи. Пользователю всё-таки надо создать источник данных, но я думаю, он с этим справится Ну и у пользователя остаётся возможность создавать отчёты, подключающиеся к другим БД, но это тоже не особо важно.
Код класса подключения: Код редактора подключения:
Я бы не догадался предложить такое решение. Но все равно поработаю над вариантом "application connection".
Насчёт своего решения с новым типом забыл ещё написать, что в приложении, после подключения к БД, до регистрации типа подключения в FastReport, надо инициализировать статическую переменную со строкой подключения приложения: Иначе работать не будет.
Ещё такой момент относительно FastReport. Вот сделал я свой тип подключения, назвал его поначалу привычными латинскими буквами. При выборе типа подключения пользователь, выбирающий мой новый тип подключения, видит что-то вроде "Objects, MyAppConnection". Переделал класс, назвал его русскими буквами, благо .NET это позволяет - стало лучше: "Objects, Подключение_редактора". Может, стоит сделать какой-нибудь статический метод у подключения, наподобие GetConnectionId, который возвращал бы понятное название типа подключения? А по умолчанию возвращалось бы то, что есть
Res.Set("Objects, MyAppConnection", "Мое подключение");
Класс у меня называется "Подключение_редактора", после подключения к БД и регистрации своего типа вызываю:
FastReport.Utils.Res.Set("Objects,Подключение_редактора", "Подключение редактора отчётов");
Но для типа подключения при его выборе отображается "Objects,Подключение_редактора".
Может в какой-то другой момент надо вызывать функцию регистрации, или какую-то другую строку передавать?
В итоге, если исходить из предположения, что connection один - все работает. Можно обойти и всю коллекцию.
Такое использование допустимо? Такой способ не описан в руководстве, но является, на мой взгляд, самым простым.
if (Report.Dictionary.Connections.Count > 0) ...
Насчёт Config.DesignerSettings.ApplicationConnection пока что не совсем понятно. Пожалуйста, объясните, как его использовать Хотя бы самые основы
Особенности: FR использует свой коннектор, соответствующий переданному в ApplicationConnection. Для SqlConnection - это MsSqlDataConnection. Поэтому использовать можно те подключения, для которых есть коннектор в FR (это OleDb, MS SQL из штатной поставки, и адд-ины Firebird, MySQL, Postgres, VistaDB, Oracle, IBM DB2, SQLite).
Замечательно Как раз то что надо Спасибо
Хотел бы снова поднять данную тему.
Вопрос в следующем: как использовать уже созданное подключение клиента при работа FastReport.
Т.е. не "использовать аналогичное подключение", а именно созданное ранее.
Сделал OracleDataConnection. И маленький отчет, который выдает значения моих переменных.
Пытался сделать так: Не получил результата. Судя по всему было создано новое подключение со старыми параметрами (во всяком случае своих инициализированных переменных не увидел. Везде был null).
Пытался добавить метод SetConnection в FastReport.Data.OracleDataConnection и потом
Получаю:
Cannot access a disposed object.
Object name: 'OracleConnection'.
при вызове r.Prepare();
Как правильно использовать уже созданное подключение?
Заранее благодарен.
FastReport версия 1.3.34.0.
Oracle.DataAccess.dll версия 2.102.2.20 (последний, скачивал 28.01).
База Oracle 10.2.
Пример FastReport.Data.OracleDataConnection скачивал тоже где-то 26.01.
Использовать "созданное ранее" подключение нельзя. Можно только "использовать аналогичное". Оно создается перед каждым чтением данных из таблицы, и разрушается после этого.
А планируется добавление такой возможности?
У нас достаточно большое количество старого кода, который требует инициализации переменных на сервере перед запуском запросов.
Возможно получиться обойтись событиями объекта Connection и инициализацией переменных в Oracle.DataAccess.Client.OracleConnection.StateChange, но хотелось бы иметь запасной вариант...
Заранее спасибо.
Сейчас это невозможно, т.к. подключение уничтожается после чтения данных. Не уверен, что удастся что-то изменить в следующих версиях.
Надеюсь обойдусь инициализацией переменных сессии в GetAdapter.
А то начальство сочтет переход на FastReport.Net не перспективным и тогда мне будет не актуально....
У меня есть 2 типа отчетов:
1. Отдельный отчет, в котором настроены все поля, и задано Соединение. Мне необходимо, чтобы я в программе(соединение с базой MS SQL) указал параметры соединения, указал строку выбора данных(например, "Select * from AllViewSorted where street_id = 4"), и мне открылся сформированный отчет. Как этого достичь?
У меня имеется такой код:
Я попробовал настроить все поля в отчете и потом удалить соединение, для того, чтобы программно его передавать в отчет. Не получается.
2. Имеются отчеты, которые будут просматриваться через отдельную программу(сделана на основе исходных кодов WINFORM приложения из дистрибутива). Все отчеты построены с использованием одного мастер шаблона, в котором задается подключение. Вопросы:
а) при изменении подключения в мастер шаблоне изменится ли подключение в дочерних шаблонах?
б) Как сделать возможность изменения подключения с сохранением данных.
Для чего все это: программа разрабатывается для одной организации, и данных о подключении там я не знаю. Поэтому и необходимо сделать возможность динамической смены данных о регистрации.
1. Проще всего так (подразумевается, что в отчете есть подключение, с одной таблицей):
report1.Load("ReportForPrg.frx");
report1.Dictionary.Connections[0].ConnectionString = строка_подключения;
report1.Dictionary.Connections[0].Tables[0].SelectCommand = текст_sql;
report1.Show();
2. У наследованных отчетов масса ограничений, в т.ч. на работу с источниками данных. Использовать наследование в данном случае не советую.