Страница 1 из 2
Stimulsoft 2017 и Devart dotConnect Oracle
Добавлено: 01 авг 2017, 17:00
t0pdevice
У нас в проекте раньше использовался Stimulsoft 2013, мы перешли на 2017 версию.
Библиотека для подключения к базе у нас Devart dotConnect Oracle.
Раньше мы использовали Stimulsoft.Report.OracleClient.dll, но теперь насколько я знаю подключения с базами сильно изменили.
Я добавил строчку:
Но теперь при просмотре отчётов появляется ошибка:
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?
Re: Stimulsoft 2017 и Devart dotConnect Oracle
Добавлено: 02 авг 2017, 01:06
Aleksey
Здравствуйте,
После релиза 2016.3 дополнительный адаптеры были встроенный непосредственно в ядро продукта, и нет необходимости их дополнительно подкючать.
А также, в последних версия был полностью убран StiConfig. И если необходимо подключить свой адаптер, нужно использовать следующий код:
StiOptions.Services.DataAdapters.Add()
StiOptions.Services.Databases.Add()
Спасибо.
Re: Stimulsoft 2017 и Devart dotConnect Oracle
Добавлено: 02 авг 2017, 08:58
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?
Re: Stimulsoft 2017 и Devart dotConnect Oracle
Добавлено: 02 авг 2017, 10:01
Леонид
Добрый день!
Внесу свои два цента.
Ваша строка подключения к БД 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)
)
)
---
Re: Stimulsoft 2017 и Devart dotConnect Oracle
Добавлено: 02 авг 2017, 12:27
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 в отчёт, который затем и использовался.
Пример кода я указывал выше.
Re: Stimulsoft 2017 и Devart dotConnect Oracle
Добавлено: 02 авг 2017, 17:14
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
Re: Stimulsoft 2017 и Devart dotConnect Oracle
Добавлено: 02 авг 2017, 19:20
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
Re: Stimulsoft 2017 и Devart dotConnect Oracle
Добавлено: 04 авг 2017, 11:56
t0pdevice
Еще одна проблема.
В GetConvertedConnectionStringToDotConnect() для получения хоста используется regex:
\\(HOST\\s*=\\s*(?<val>[0-9a-zA-Z_-]+)\\)
Он воспринимается только имена, а IP-адреса нет.
Re: Stimulsoft 2017 и Devart dotConnect Oracle
Добавлено: 04 авг 2017, 15:47
Aleksey
Здравствуйте,
Спасибо за детальное описание проблемы.
Сейчас с этим разбираемся, о результатах дадим знать в данном топике.
Спасибо.
Re: Stimulsoft 2017 и Devart dotConnect Oracle
Добавлено: 17 авг 2017, 11:35
t0pdevice
Есть новости?