Программное изменение строки подключения в *.mrt-файле

Обсуждение Stimulsoft Reports.NET
Ответить
Аватара пользователя
compositum
Сообщения: 252
Зарегистрирован: 15 янв 2008, 15:12
Откуда: Санкт-Петербург

Программное изменение строки подключения в *.mrt-файле

Сообщение compositum »

:redeye:
Я написал программку, которая запускает любые отчеты стимула. Это удобно тем, что я могу прислать клиенту *.mrt-файл, он разместит его в удобном для него месте в иерархии каталогов, хранящих данные файлы и дело сделано. Программа состоит из тривью (иерархия каталогов, содержащих *.mrt-файлы) и листвью (собственно отображение *.mrt-файлов). Двойным кликом файлы открываются.

Изображение

Проблема вот в чем:
Строка подключения, работающая у меня, не будет работать у клиента, т.к. у него она будет другая.
Т.о. нужна возможность программного изменения (в случае необходимости) в *.mrt-файлах строки подключения.

В общих чертах я пошел по такому пути:
На событие инициализации отчета (BeginRenderEvent) я повесил код, проверяющий возможность подключения:
Stimulsoft.Report.Dictionary.StiSqlDatabase cnn =
(Stimulsoft.Report.Dictionary.StiSqlDatabase) this.Dictionary.Databases["Соединение"];
//MessageBox.Show(cnn.ConnectionString);
using (SqlConnection sqlcnn = new SqlConnection (cnn.ConnectionString))
{
try{sqlcnn.Open();}
catch {MessageBox.Show("Не удалось подключиться к базе данных. Проверьте правильность строки подключения.", "Внимание!");
frmParametres.Visible = false;
frmConnect.Visible = true;
}
sqlcnn.Close();
}
Если подключение выполнено успешно, выводится окно запроса параметров:

Изображение

Если таковая возможность отсутствует, то видимость окна, запрашивающего параметры устанавливается в false, а включается видимость др. окна, в котором у юзера запрашивается верная строка подключения:

Изображение

Введенная строка проверяется повторно. Если все нормально - строка подключения сохраняется.
Затем юзеру предлагается перезапустить отчет.
Код по замене строки подключения выглядит так:
Stimulsoft.Report.Dictionary.StiSqlDatabase cnn =
(Stimulsoft.Report.Dictionary.StiSqlDatabase) this.Dictionary.Databases["Соединение"];
cnn.ConnectionString=textConnect.Text;
using (SqlConnection sqlcnn = new SqlConnection (cnn.ConnectionString))
{
try{sqlcnn.Open();}
catch {MessageBox.Show("Не удалось подключиться к базе данных. Проверьте правильность строки подключения.", "Внимание!");
return;
}
sqlcnn.Close();
}
frmConnect.Close();
MessageBox.Show("Подключение прошло успешно. Перезапустите отчёт.", "Успешная операция.");
Однако, как оказалось изменения не сохраняются в исходном *.mrt-файле. Видимо оно происходит применительно к объекту отчета, созданному на основе этого файла. Как сделать это изменение в исходном *.mrt-файле?
Vital
Сообщения: 647
Зарегистрирован: 09 июн 2006, 12:23

Программное изменение строки подключения в *.mrt-файле

Сообщение Vital »

Здравствуйте,

А изменение нужно сделать из кода события BeginRenderEvent отчета? Допускается ли при это модификация кода приложения которое запускает отчет (к примеру можно посмотреть, не изменилась ли строка подключения и если изменилась то считать ее оттуда)?

Спасибо.
Аватара пользователя
compositum
Сообщения: 252
Зарегистрирован: 15 янв 2008, 15:12
Откуда: Санкт-Петербург

Программное изменение строки подключения в *.mrt-файле

Сообщение compositum »

Vital писал(а):Здравствуйте,

А изменение нужно сделать из кода события BeginRenderEvent отчета? Допускается ли при это модификация кода приложения которое запускает отчет (к примеру можно посмотреть, не изменилась ли строка подключения и если изменилась то считать ее оттуда)?

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

Подскажите пожалуйста.
Vital
Сообщения: 647
Зарегистрирован: 09 июн 2006, 12:23

Программное изменение строки подключения в *.mrt-файле

Сообщение Vital »

Здравствуйте,

Вот примерный код как это можно делать:

Код: Выделить всё

StiReport report = new StiReport();
report.Load(myReportFile);

//Запоминаем строку коннекта до запуска отчета
string oldConnectionString = null;
if (report.Dictionary.Databases.Count > 0)
 oldConnectionString = ((StiSqlDatabase)report.Dictionary.Databases[0]).ConnectionString;

report.Show();

//Читаем новую строку коннекта. Внимание! читаем ее не из report, а из report.CompiledReport
string newConnectionString = null;
if (report.CompiledReport.Dictionary.Databases.Count > 0)
   newConnectionString = ((StiSqlDatabase)report.CompiledReport.Dictionary.Databases[0]).ConnectionString;

//Если строка коннекта изменилась то меняем ее в исходном отчете
if (oldConnectionString != null && oldConnectionString != newConnectionString)
{
   ((StiSqlDatabase)report.Dictionary.Databases[0]).ConnectionString = newConnectionString;
   report.Save(myReportFile);
}

Спасибо.
Аватара пользователя
compositum
Сообщения: 252
Зарегистрирован: 15 янв 2008, 15:12
Откуда: Санкт-Петербург

Программное изменение строки подключения в *.mrt-файле

Сообщение compositum »

Vital писал(а):Здравствуйте,

Вот примерный код как это можно делать:

Код: Выделить всё

StiReport report = new StiReport();
report.Load(myReportFile);

//Запоминаем строку коннекта до запуска отчета
string oldConnectionString = null;
if (report.Dictionary.Databases.Count > 0)
 oldConnectionString = ((StiSqlDatabase)report.Dictionary.Databases[0]).ConnectionString;

report.Show();

//Читаем новую строку коннекта. Внимание! читаем ее не из report, а из report.CompiledReport
string newConnectionString = null;
if (report.CompiledReport.Dictionary.Databases.Count > 0)
   newConnectionString = ((StiSqlDatabase)report.CompiledReport.Dictionary.Databases[0]).ConnectionString;

//Если строка коннекта изменилась то меняем ее в исходном отчете
if (oldConnectionString != null && oldConnectionString != newConnectionString)
{
   ((StiSqlDatabase)report.Dictionary.Databases[0]).ConnectionString = newConnectionString;
   report.Save(myReportFile);
}

Спасибо.
Спасибо вам большое!!!! Завтра на работе попробую.
Ответить