Страница 1 из 1

Как выполнить SQL код после подключения к БД?

Добавлено: 18 июл 2018, 15:41
Иван Иванович
Доброго дня!
Появилась необходимость выполнить некий SQL запрос перед получением данных (выполнением запросов и выполнением процедур).
К примеру при подключении к SQL серверу надо установить другую очередность дней "SET DATEFIRST 7", или дать определенные права для подключения: sp_setapprole "role", "pas".
Как это можно сделать используя отчет, или каким-либо образом передать подготовленный SqlConnection для использования?

На данный момент для подключения к БД я передаю строку подключения динамически:

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

var report = new StiReport();
            report.Load(template.Data);


            foreach (StiSqlDatabase dbs in report.Dictionary.Databases)
                if (dbs.ConnectionType == StiConnectionType.Sql)
                    dbs.ConnectionString = SqlConnectionString;

            report.Compile();
            foreach (StiVariable repVar in report.Dictionary.Variables)
               
                    report[repVar.Alias] =ParamValue(repVar.Alias);
               

            report.Render();

Re: Как выполнить SQL код после подключения к БД?

Добавлено: 18 июл 2018, 18:40
Aleksey
Здравствуйте,

Можете добавить дополнительный источник данных с необходимым запросом. И вызывать для него метод Connect() в событии отчета, BeforePrint к примеру.

Спасибо.

Re: Как выполнить SQL код после подключения к БД?

Добавлено: 18 июл 2018, 23:36
Иван Иванович
Aleksey писал(а): 18 июл 2018, 18:40 Здравствуйте,

Можете добавить дополнительный источник данных с необходимым запросом. И вызывать для него метод Connect() в событии отчета, BeforePrint к примеру.

Спасибо.
Спасибо за идею.
Модернизировал свой код, добавил обработчики события BeginRender, т.к. именно этот метд использую для формирования отчета.
Но, обработчик BeginRender (

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

 report.BeginRender += Report_BeginRender; 
) не срабатывает, в метод Report_BeginRender не заходит.
Ну а

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

report.BeginRenderEvent.Script = "set_db_param.Connect();";
не выполняет запросы, к БД. Думаю по той-же причине по которой не заходит в обработчик.
Как победить обработчики?

вот полный код формирования отчета:

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

	            var report = new StiReport();
            report.Load(template.Data);


            foreach (StiSqlDatabase dbs in report.Dictionary.Databases)
                if (dbs.ConnectionType == StiConnectionType.Sql)
                {
                    dbs.ConnectionString = SqlConnectionString;

                    _dbParamSource = dbs.CreateDataSource("set_db_param", "set_db_param");
                    _dbParamSource.SqlCommand = "SET DATEFIRST 7";
                    report.DataSources.Add(_dbParamSource);
                }
                
            // Добавление обработчиков событий
            report.BeginRenderEvent.Script = "set_db_param.Connect();";
            report.BeginRender += Report_BeginRender;
            //------------------------------------

            report.Compile();
            foreach (StiVariable repVar in report.Dictionary.Variables)
            {
            	// Передаем значения переменных
            }   
                

            report.Render();
   

Re: Как выполнить SQL код после подключения к БД?

Добавлено: 19 июл 2018, 12:03
Иван Иванович
Доброго дня!
Посмотрел внимательно на происходящие. В результате выяснилось, что я указывал не корректное название подключения вот тут:

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

_dbParamSource = dbs.CreateDataSource("set_db_param", "set_db_param");
первым параметром должно идти название подключения.
корректный код выглядит вот так:

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

foreach (StiSqlDatabase dbs in report.Dictionary.Databases)
                if (dbs.ConnectionType == StiConnectionType.Sql)
                {
                    dbs.ConnectionString = SqlConnectionString;

                    var ds = dbs.CreateDataSource(dbs.Name, "set_param");
                    ds.SqlCommand = "SET DATEFIRST 7";
                    report.DataSources.Add(ds);
                    //dbs.ConnectedEvent.Script = "set_param.Connect();";
                    report.BeginRenderEvent.Script = "set_param.Connect();";
                }
Интересный момент, позволяющий выстрелить себе в ногу. При указании несуществующего подключения отчет не выдал ошибок ни при компиляции ни при построении. И, даже, построился. Пи этом я использую метод создания источника непосредственно у подключения. Т.е. при создании понятно к какому источнику его привязывать, зачем указывать имя и допускать возможность ошибки?

Второй момент, при создании отчета в дизайнере или динамически можно указать названия объектов с пробелами пример "my sql connect", "check data source" и т.д.
В дальнейшем невозможно без ошибок компиляции использовать такие объекты в скриптах, да элементарно, создать обработчик для такого объекта.

Теперь вопрос.
При использовании

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

report.BeginRenderEvent.Script = "set_param.Connect();";
запрос "SET DATEFIRST 7" выполняется ПОСЛЕ выполнения остальных скриптов. При использовании

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

dbs.ConnectedEvent.Script = "set_param.Connect();";
запрос выполняется ДВА раза до и после выполнения скриптов. В обработчике для какого события следует указать выполнение скрипта, что-бы он гарантированно выполнился один раз и до начала выполнения всех остальных запросов?

Спасибо.

Re: Как выполнить SQL код после подключения к БД?

Добавлено: 19 июл 2018, 15:33
Aleksey
Здравствуйте,

Как вариант, вы можете установить свойство ConnectOnStart для всех источников в false, и затем в событии коннектить их у нужном порядке.

Спасибо.