Stimulsoft.Report.OracleODP

Обсуждение Stimulsoft Reports.NET
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Stimulsoft.Report.OracleODP

Сообщение Леонид »

Добрый день!

Установили предрелизную версию 2015.1.10.0. Вроде всё хорошо, но не можем скомпилировать Stimulsoft.Report.OracleODP, выдаёт 11 предупреждений вида:
The type 'Stimulsoft.Report.Dictionary.StiOracleODPSource' in 'C:\PROJECTS\Stimulsoft.Report.OracleODP\StiOracleODPSource.cs'
conflicts with the imported type
'Stimulsoft.Report.Dictionary.StiOracleODPSource' in 'c:\Program Files\Stimulsoft Reports.Net 2015.1.10.0\Stimulsoft.Report.dll'.
Using the type defined in 'C:\PROJECTS\Stimulsoft.Report.OracleODP\StiOracleODPSource.cs'.
C:\PROJECTS\Stimulsoft.Report.OracleODP\StiOracleODPAdapterService.cs 58 13 Stimulsoft.Report.OracleODP
и 2 ошибки:
Error 7 The type or namespace name 'StiSqlDatabaseEditForm' could not be found (are you missing a using directive or an assembly reference?) C:\PROJECTS\Stimulsoft.Report.OracleODP\StiOracleODPDatabase.cs 334 20 Stimulsoft.Report.OracleODP
При этом в Reference указаны:

Stimulsoft.Base
Stimulsoft.Database
Stimulsoft.Report
Stimulsoft.Report.Win

При прочих равных условиях, но с dll'ками от релизной версии 2015.1.0.0 - всё компилируется нормально.
Помогите скомпилировать под версию 2015.1.10.0.
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Stimulsoft.Report.OracleODP

Сообщение Aleksey »

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

В последних предрелизных версиях, после релиза 1015.1, были сделаны изменения и рефакторинг кода по работе с данными. Все дополнительные адаптеры были встроены в сам дизйнер, и сейчас нет необходимости дополнительно компилировать и подключать адаптеры.
По поводу почему возникает ошибка при подключении старым путем, необходимо время разобраться. О результатах сообщим.

Спасибо.
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Stimulsoft.Report.OracleODP

Сообщение Леонид »

Да, я пробовал, но в версии 2015.1.10.0 при добавлении адаптера Oracle даже в пустом проекте возникает исключение:

Oracle assemblies is not found!
at Stimulsoft.Base.StiOracleConnector.Get(String connectionString) in d:\Stimulsoft\Stimulsoft.Reports\Stimulsoft.Base\Data\Connectors\Sql\StiOracleConnector.cs:line 440
at Stimulsoft.Report.Dictionary.StiOracleDatabase.CreateConnector(String connectionString) in d:\Stimulsoft\Stimulsoft.Reports\Stimulsoft.Report\Dictionary\Databases\Sql\StiOracleDatabase.cs:line 59
at Stimulsoft.Report.Dictionary.Design.StiDataEditors.SqlDatabaseEdit(StiSqlDatabase database, Boolean newDatabase) in d:\Stimulsoft\Stimulsoft.Reports\Stimulsoft.Report.Design\Dictionary\StiDataEditors.cs:line 164
at Stimulsoft.Report.Dictionary.StiSqlDatabase.Edit(Boolean newDatabase) in d:\Stimulsoft\Stimulsoft.Reports\Stimulsoft.Report\Dictionary\Databases\Sql\StiSqlDatabase.cs:line 274
at Stimulsoft.Report.Design.StiReportNewConnection.CreateNewConnection(String newName) in d:\Stimulsoft\Stimulsoft.Reports\Stimulsoft.Report.Design\StiReportNewConnection.cs:line 79
at Stimulsoft.Report.Design.Panels.StiDictionaryPanelService.InvokeConnectionNew() in d:\Stimulsoft\Stimulsoft.Reports\Stimulsoft.Report.Design\Panels\StiDictionaryPanelService.cs:line 1037

Stimulsoft Reports
Version: 2015.1.10 from 26 June 2015
v4.0.30319
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Stimulsoft.Report.OracleODP

Сообщение Aleksey »

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

В последних версиях, вам достаточно в папку bin или в references добавить только саму оракловскую dll-ку Oracle.DataAccess.
Для standalone designer.exe просто скопировать данную длл-ку в папку с дизайнером.

Спасибо.
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Stimulsoft.Report.OracleODP

Сообщение Леонид »

Спасибо за подсказку. Проверили, да, работает, но не полностью.
То есть, вместо предыдущего адаптера удалось создать новое Oracle соединение, пересоздал DataSource, сделали RetriveFields (создали все поля) из запроса, но при выполнении возникает другое исключение:

Object reference not set to an instance of an object.
at Reports.Отчет.n411___Счёт___Merchant_BeginRender(Object sender, EventArgs e)
at Stimulsoft.Report.StiReport.InvokeBeginRender() in d:\Stimulsoft\Stimulsoft.Reports\Stimulsoft.Report\StiReport.cs:line 1826
at Stimulsoft.Report.Engine.StiRenderProviderV2.Render(StiReport report, StiRenderState state) in d:\Stimulsoft\Stimulsoft.Reports\Stimulsoft.Report\Engine\EngineV2\StiRenderProviderV2.cs:line 381
at Stimulsoft.Report.Engine.StiReportV2Builder.RenderSingleReport(StiReport masterReport, StiRenderState renderState) in d:\Stimulsoft\Stimulsoft.Reports\Stimulsoft.Report\Engine\EngineV2\Builders\StiReportV2Builder.cs:line 144
at Stimulsoft.Report.StiReport.RenderReport(StiRenderState renderState) in d:\Stimulsoft\Stimulsoft.Reports\Stimulsoft.Report\StiReport.RenderCompilePrint.cs:line 350
at Stimulsoft.Report.StiReport.Render(StiRenderState renderState, StiGuiMode guiMode) in d:\Stimulsoft\Stimulsoft.Reports\Stimulsoft.Report\StiReport.RenderCompilePrint.cs:line 212

При этом, когда я скинул dll'ку в директорию Стимула, заработал и старый провайдер (dll'ка которого лежит в той же директории с дизайнером), скомпилированный для релизной версии 2015.1.0.0, это разумеется абсурд, и использовать это так нельзя, но для "спортивного интереса".

Будем думать, как уйти от старой версии провайдера, но пока он нам ещё понадобится на какое-то время, к тому же с версией 2.112.1.0 Oracle.DataAccess.dll пока что не получилось вывести самый простой отчёт даже в дизайнере.
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Stimulsoft.Report.OracleODP

Сообщение Aleksey »

Здравствуйте, Леонид

Не смогли воспроизвести проблему на последнем билде.
Не могли бы прислать пример отчета и тестовую таблицу, на котором воспроизводится ошибка для анализа.

Спасибо.
Вложения
Capture.PNG
Capture.PNG (87.4 КБ) 3486 просмотров
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Stimulsoft.Report.OracleODP

Сообщение Леонид »

Добрый день!

Мы так же провели много исследований, и вот, что выяснили.

В принципе, раз с версии 2015.1.0.0 уже нет необходимости в Stimulsoft.Report.OracleODP.dll, то мы решили от неё избавится. К слову у нас 325 отчётов, из них 265 в которых используется статически определённый Connection и DataSource.

Соответственно, мы написали процедуру, которая загружает последовательно каждый blob (отчёт mrt) из базы, меняет в нём по адресу XPath "StiSerializer/Dictionary/Databases", далее для одного коннекта (он всегда там один) значение атрибута type с "Stimulsoft.Report.Dictionary.StiOracleODPDatabase" на "Stimulsoft.Report.Dictionary.StiOracleDatabase".

Аналогично в пути "StiSerializer/Dictionary/DataSources" для одного DataSource (он так же один для этого коннекта) значение атрибута type с "Stimulsoft.Report.Dictionary.StiOracleODPSource" на "Stimulsoft.Report.Dictionary.StiOracleSource".

Таким образом меняем все blob'ы (отчёты в базе), компилируем проект под 2015.1.10.0 и всё работает, теперь без использования Stimulsoft.Report.OracleODP.dll, что не может не радовать.

Однако, столкнулись с другой проблемой, которую можно получить ТОЛЬКО, если делать SELECT FROM TABLE из Stored procedure Oracle, а с помощью SELECT FROM DUAL не удалось получить ошибку.

В приложении два файла: один, где работает, а другой, где не работает.

Суть такая, что у нас есть Stored procedure Oracle, из которой мы выбираем поля, и есть параметр типа decimal (в Oracle у нас это Number), соответственно, когда значение меньше Int32.Max (т.е. 2,147,483,647), то всё работает, а когда больше, то получаем исключение вида:
Version: 2015.1.10 from 26 June 2015

v4.0.30319

Value was either too large or too small for an Int32.

mscorlib

at System.Decimal.FCallToInt32(Decimal d)
at System.Decimal.System.IConvertible.ToInt32(IFormatProvider provider)
at System.Convert.ToInt32(Object value)
at Oracle.DataAccess.Client.OracleParameter.PreBind_Int32()
at Oracle.DataAccess.Client.OracleParameter.PreBind(OracleConnection conn, IntPtr errCtx, Int32 arraySize)
at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior)
at Oracle.DataAccess.Client.OracleDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
at Stimulsoft.Report.Dictionary.StiSqlSource.RetrieveData(Boolean schemaOnly) in d:\Stimulsoft\Stimulsoft.Reports\Stimulsoft.Report\Dictionary\DataSources\Sql\StiSqlSource.cs:line 341
В нерабочем примере в событии BeginRender есть код:

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

rep_bill.Parameters["DOC_CODE"].ParameterValue = 4004219026;
Вот, когда происходит выборка данных, то получаем этот Exception.

Примечание: Проблему обнаружили случайно, т.к. в Москве коды документов меньше миллиарда, а в других регионах цифры уже конечно больше Int32. То есть, вот этот код документа 4004219026 (из Ростова) помог нам найти этот баг.

Ждём скорейшего решения проблемы, т.к. пользователи уже ждут этот предрелизный билд, т.к. в нём вы исправили проблему с компрессией jpeg'ов (из этого поста http://forumru.stimulsoft.com/viewtopic.php?f=8&t=4222), а тут ещё теперь и документы не печатаются, - пришлось "откатываться" пока на 2015.1.0.0.
Вложения
DoesntWork.mrt
Не работает
(5.1 КБ) 321 скачивание
Works.mrt
Работает
(5.08 КБ) 332 скачивания
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Stimulsoft.Report.OracleODP

Сообщение Aleksey »

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

Спасибо за детальное описание проблемы.
Постараемся разобраться с данной проблемой как можно быстрее.

Спасибо.
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Stimulsoft.Report.OracleODP

Сообщение Aleksey »

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

Не могли бы прислать еще и тестовую процедуру, которая воспроизводит проблему для анализа.

Спасибо.
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Stimulsoft.Report.OracleODP

Сообщение Леонид »

Доброе утро!

Упростили запрос, выглядит он так:

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

SELECT *
  FROM TABLE(DOCUMENTS_REPORTS_PKG.REP_BILL(:DOC_CODE))
Тело (body) запроса в базе Oracle:

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

  FUNCTION REP_BILL(in_DOC_CODE IN NUMBER) RETURN TAB_REP_BILL PIPELINED
  AS
    v_rec REC_REP_BILL := REC_REP_BILL(null, null, null, null);
  BEGIN
     FOR curr IN (SELECT o.DOC_CODE, 
                         o.ORD_NUM,
                         o.ORD_DATE, 
                         fi.PROPERTY || ' ' || fi.FIRM_NAME as SUPPLIER_NAME
                    FROM orders o
                   WHERE o.DOC_CODE = in_DOC_CODE)
    LOOP
      v_rec.DOC_CODE := curr.DOC_CODE;
      v_rec.ORD_NUM_DETAILED := curr.ORD_NUM_DETAILED;
      v_rec.ORD_DATE := curr.ORD_DATE;
      v_rec.SUPPLIER_NAME := curr.SUPPLIER_NAME;
      PIPE ROW (v_rec);
    END LOOP;
  END REP_BILL;
Таблица из которой выбираются данные:

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

CREATE OR REPLACE TYPE MERCHANT.REC_REP_BILL AS OBJECT (
    DOC_CODE NUMBER,
    ORD_NUM NVARCHAR2(20),
    ORD_DATE DATE,
    SUPPLIER_NAME NVARCHAR2(100)
);
Структура данных (Oracle type) для процедуры FUNCTION REP_BILL:

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

CREATE TABLE MERCHANT.ORDERS
(
  DOC_CODE                 NUMBER               NOT NULL,
  ORD_NUM                  NUMBER               NOT NULL,
  ORD_DATE                 DATE                 DEFAULT TRUNC(SYSDATE)        NOT NULL,
  SUPPLIER_NAME            NVARCHAR2(100)
)
Думаю, это всё можно сократить до одного поля DOC_CODE для простоты.
Ответить