Stimulsoft 2017 и Devart dotConnect Oracle

Обсуждение Stimulsoft Reports.NET
Аватара пользователя
t0pdevice
Сообщения: 107
Зарегистрирован: 15 авг 2016, 09:59

Stimulsoft 2017 и Devart dotConnect Oracle

Сообщение t0pdevice »

У нас в проекте раньше использовался Stimulsoft 2013, мы перешли на 2017 версию.
Библиотека для подключения к базе у нас Devart dotConnect Oracle.
Раньше мы использовали Stimulsoft.Report.OracleClient.dll, но теперь насколько я знаю подключения с базами сильно изменили.

Я добавил строчку:

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

StiOracleConnector.LoadDevartConnector();
Но теперь при просмотре отчётов появляется ошибка:
ORA-12541: TNS:no listener
Host = localhost
Port = 1521
Причем если смотреть подключение в дизайнере отчётов, то там в connectionstring в Server стоит почему-то 127.0.0.1
Даже если вручную изменить этот адрес на нужный нашего сервера и нажать просмотр отчёта, то ошибка повторяется.

У нас также прописано следующее, как было и раньше:

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

StiConfig.Services.Add(new StiOracleAdapterService());
StiConfig.Services.Add(new StiOracleDatabase());
 
OracleConnectionStringBuilder connectionString = new OracleConnectionStringBuilder
{
Direct = true,
Server = connection.Server,
Port = connection.Port,
Sid = connection.Sid,
UserId = connection.UserId,
Password = connection.Password,
ConnectionTimeout = 15
};
 
report.Dictionary.Databases.Clear();
report.Dictionary.Databases.Add(new StiOracleDatabase("connect", connectionString.ToString()));

Если смотреть через дебаггер, то в connectionString стоит нужный адрес сервера, а в готовом соединении отчёта опять изменился на 127.0.0.1

В чем может быть проблема? Или нужно что-то еще дописать для интеграции с devart?
Aleksey
Сообщения: 2906
Зарегистрирован: 22 апр 2010, 06:57

Re: Stimulsoft 2017 и Devart dotConnect Oracle

Сообщение Aleksey »

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

После релиза 2016.3 дополнительный адаптеры были встроенный непосредственно в ядро продукта, и нет необходимости их дополнительно подкючать.
А также, в последних версия был полностью убран StiConfig. И если необходимо подключить свой адаптер, нужно использовать следующий код:
StiOptions.Services.DataAdapters.Add()
StiOptions.Services.Databases.Add()

Спасибо.
Аватара пользователя
t0pdevice
Сообщения: 107
Зарегистрирован: 15 авг 2016, 09:59

Re: Stimulsoft 2017 и Devart dotConnect Oracle

Сообщение t0pdevice »

В отчёте есть connect со следующим connectionstring:
User Id=u1401;Password=1401;Server=PROG-31;Connection Timeout=15;Direct=True;Sid=XE;Port=1521
Но при попытке просмотра отчёта он выдает:
ORA-12541: TNS:no listener
Host = localhost
Port = 1521
Почему он обращается к localhost, если сервер PROG-31?
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Stimulsoft 2017 и Devart dotConnect Oracle

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

Добрый день!

Внесу свои два цента.

Ваша строка подключения к БД Oracle не совсем верная. Она должна выглядеть примерно так:

Password=1401; User ID=u1401; Data Source=PROG-31; Persist Security Info=True;

Не забывайте также, что все настройки прописаны в файле tnsnames.ora в директории OracleClient на клиентской машине (в моём случае это C:\oracle11203\network\admin\tnsnames.ora).

В вашем случае там, вероятно написано, что-то вроде:

---
PROG-31 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = PROG-31-SRV)
)
)
---
Аватара пользователя
t0pdevice
Сообщения: 107
Зарегистрирован: 15 авг 2016, 09:59

Re: Stimulsoft 2017 и Devart dotConnect Oracle

Сообщение t0pdevice »

Леонид, добрый день!

С Data Source ничего не изменилось. Да и не в этом ошибка, потому что devart понимается и Server:
https://www.devart.com/dotconnect/oracl ... tring.html
Data Source -or- Server -or- Host The name of TNS alias of Oracle database to which to connect. For more information refer to Server property.
Из моего первого сообщения видно, что используется их OracleConnectionStringBuilder, в котором как раз через свойство Server указывается сервер.
С этим connectionstring приложение подключается к базе и все работает хорошо.
Не забывайте также, что все настройки прописаны в файле tnsnames.ora в директории OracleClient на клиентской машине (в моём случае это C:\oracle11203\network\admin\tnsnames.ora).
У нас не используется OracleClient, так как devart dotConnect Oracle имеет DirectMode, выше видно, что он указан Direct=true.
https://www.devart.com/dotconnect/oracl ... tmode.html
А это означает, что при включенном direct для работы с базой никакой клиент Oracle не нужен.

У нас все остальное работает, как и раньше и с Stimulsoft 2013 также все работало, мы просто передавали свой connectionstring в отчёт, который затем и использовался.
Пример кода я указывал выше.
Аватара пользователя
t0pdevice
Сообщения: 107
Зарегистрирован: 15 авг 2016, 09:59

Re: Stimulsoft 2017 и Devart dotConnect Oracle

Сообщение t0pdevice »

Более детальная ошибка, к примеру, при попытке получения столбцов в datasource:
ORA-12541: TNS:no listener
Host = localhost
Port = 1521

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

  в Devart.Data.Oracle.cd.a(String A_0, String A_1, String A_2, String A_3)
   в Devart.Data.Oracle.dj.a(cf A_0, Boolean A_1)
   в Devart.Data.Oracle.dj.a(cf A_0, r A_1)
   в Devart.Data.Oracle.OracleInternalConnection..ctor(cf connectionOptions, OracleInternalConnection proxyConnection)
   в Devart.Data.Oracle.az.a(v A_0, Object A_1, DbConnectionBase A_2)
   в Devart.Common.DbConnectionFactory.a(DbConnectionPool A_0, v A_1, DbConnectionBase A_2)
   в Devart.Common.DbConnectionPoolGroup.a(DbConnectionPool A_0, DbConnectionBase A_1)
   в Devart.Common.DbConnectionPool.a(DbConnectionBase A_0)
   в Devart.Common.DbConnectionPool.GetObject(DbConnectionBase owningConnection)
   в Devart.Common.DbConnectionFactory.b(DbConnectionBase A_0)
   в Devart.Common.DbConnectionClosed.Open(DbConnectionBase outerConnection)
   в Devart.Common.DbConnectionBase.Open()
   в Devart.Data.Oracle.OracleConnection.Open()
   в Stimulsoft.Report.Dictionary.StiSqlAdapterService.OpenConnection(IDbConnection connection, StiData data, StiDictionary dictionary) в D:\Stimulsoft\Stimulsoft.Reports\Stimulsoft.Report\Dictionary\Adapters\Sql\StiSqlAdapterService.cs:строка 483
   в Stimulsoft.Report.Dictionary.StiSqlAdapterService.GetColumnsFromData(StiData data, StiDataSource dataSource, CommandBehavior retrieveMode) в D:\Stimulsoft\Stimulsoft.Reports\Stimulsoft.Report\Dictionary\Adapters\Sql\StiSqlAdapterService.cs:строка 218
   в Stimulsoft.Report.Dictionary.Design.StiDataStoreSourceEditForm.tbRetrieveColumns_Click(Object sender, EventArgs e) в D:\Stimulsoft\Stimulsoft.Reports\Stimulsoft.Report.Design\Dictionary\StiDataStoreSourceEditForm.cs:строка 1025
Аватара пользователя
t0pdevice
Сообщения: 107
Зарегистрирован: 15 авг 2016, 09:59

Re: Stimulsoft 2017 и Devart dotConnect Oracle

Сообщение t0pdevice »

Пришлось поковыряться в библиотеках.
В Stimulsoft.Base.StiOracleDevartConnector есть метод:

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

private string GetConvertedConnectionStringToDotConnect(string connectionString, out string dbSchemaName)
Который преобразует connectionstring:
/// <summary>
/// Конвертируем опции соединения их формата tnsnames.ora в формат dotConnect
/// Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=leshik-d16ef95c)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));User Id=SCOTT;Password=tiger;
/// SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=leshik-d16ef95c)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)));uid=myUsername;pwd=myPassword;
/// Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;Integrated Security = no;
///
/// </summary>
///
/// <returns>
/// Строка соединения в формате dotConnect.
/// </returns>
Отсюда, если сделать изменения кода, который я раньше приводил:

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

            OracleConnectionStringBuilder connectionString = new OracleConnectionStringBuilder
            {
                Direct = true,
                Server = $@"(DESCRIPTION=(ADDRESS=(PROTOCOL = TCP)(HOST = {connection.Server})(PORT = {connection.Port}))(CONNECT_DATA = (SERVICE_NAME = {connection.Sid})))",
                Port = connection.Port,
                Sid = connection.Sid,
                UserId = connection.UserId,
                Password = connection.Password,
                ConnectionTimeout = 15
            };
Все заработало! Получается в Server нужно передавать не просто адрес сервера, а вот этот весь datasource.
Мне кажется это не совсем правильно, к примеру, у меня в Server передается имя хоста или IP адрес, и программа отлично работает с таким connectionstring:
User Id=u1401;Password=1401;Server=PROG-31;Connection Timeout=15;Direct=True;Sid=XE;Port=1521
А после обработки через GetConvertedConnectionStringToDotConnect(), моя строка становилась:
User Id=u1401;Password=1401;Server=;Direct=True;Sid=;
Поэтому и была ошибка подключения к localhost, так как ваш парсер отрабатывал некорректно.

Могли бы вы в GetConvertedConnectionStringToDotConnect() предусмотреть мой вариант, чтобы подхватывались хотя бы следующие параметры:
* Sid
* Server (если это просто имя хоста или IP адрес)
В идеале любые параметры из их документации должны передаваться:
https://www.devart.com/dotconnect/oracl ... tring.html
Аватара пользователя
t0pdevice
Сообщения: 107
Зарегистрирован: 15 авг 2016, 09:59

Re: Stimulsoft 2017 и Devart dotConnect Oracle

Сообщение t0pdevice »

Еще одна проблема.

В GetConvertedConnectionStringToDotConnect() для получения хоста используется regex:
\\(HOST\\s*=\\s*(?<val>[0-9a-zA-Z_-]+)\\)
Он воспринимается только имена, а IP-адреса нет.
Aleksey
Сообщения: 2906
Зарегистрирован: 22 апр 2010, 06:57

Re: Stimulsoft 2017 и Devart dotConnect Oracle

Сообщение Aleksey »

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

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

Спасибо.
Аватара пользователя
t0pdevice
Сообщения: 107
Зарегистрирован: 15 авг 2016, 09:59

Re: Stimulsoft 2017 и Devart dotConnect Oracle

Сообщение t0pdevice »

Есть новости?
Ответить