Подключение и работа с Oracle

ListopadListopad Хабаровск
отредактировано August 2009 Раздел: FastReport .NET
Пытаюсь подключиться к Oracle через строку соединения
Provider=msdaora;Password=ПАРОЛЬ;User ID=ПОЛЬЗОВАТЕЛЬ_БД;Data Source=ИМЯ_СЕРВЕРА_БД;Persist Security Info=True
Делаю тест соединения - успешно. Соединение появляется в источниках данных, но у таблицы из данного соединения не показываются столбцы и соответственно никакие данные из нее я получить немогу.

Также попробовала использовать FastReport.Oracle.dll. В списке типов подключений появилось "Подключение к Oracle". Ввожу необходимые данные, нажимаю тест - все снова успешно. Но теперь даже таблицы БД, которые можно выбрать, он не показывает.

Подскажите, в чем проблема? )
«1

Комментарии

  • отредактировано August 2009
    Через OleDB подключаться не стоит, мастер не сможет корректно отобразить имена полей. Дело в том, что в разных диалектах SQL используются разные символы-кавычки, напр. select * from "my table", или select * from [my table]. Т.к. OleDb - адаптер универсальный, он не может это учесть в принципе.
    FastReport.Oracle.dll знает особенности диалекта оракла. Кроме того, он показывает только те таблицы, что доступны пользователю:

    OracleDataConnection.cs:
        private void GetDBObjectNames(string name, string columnName, List<string> list)
        {
          DataTable schema = null;
          using (DbConnection connection = GetConnection())
          {
            connection.Open();
            OracleConnectionStringBuilder builder = new OracleConnectionStringBuilder(connection.ConnectionString);
     //здесь фильтр по UserID
            schema = connection.GetSchema(name, new string[] { builder.UserID, null });
          }
          foreach (DataRow row in schema.Rows)
          {
            list.Add(row[columnName].ToString());
          }
        }
    
  • ListopadListopad Хабаровск
    отредактировано 13:50
    Спасибо, все заработало)
  • ListopadListopad Хабаровск
    отредактировано 13:50
    :)
    Проблема с подключением к Ораклу.
    Я заново переустановила винду и поставила репорт.
    Сделала dll с помощью выложенной на сайте программы, добавила ее в плагины.
    Строка "Подключение к Оракл" не появилась в списке источников подключения.

    Что не так?
    И еще вопрос: какой должен быть фреймворк? И вообще принципиальна ли для фаст репорта версия фреймворка?
  • dron-sdron-s Россия
    отредактировано 13:50
    написал:
    И еще вопрос: какой должен быть фреймворк? И вообще принципиальна ли для фаст репорта версия фреймворка?
    fr.net поддерживает версии Framework от 2.0 и выше
  • отредактировано 13:50
    Возможно, есть конфликт версий файлов FastReport.dll и FastReport.Oracle.dll. Надо сделать очистку проекта (удалить dll из папок bin\Debug, bin\Release, obj) и пересобрать.
  • ListopadListopad Хабаровск
    отредактировано 13:50
    Снова появились вопросы... :)

    На компьютер установлен Windows Server 2000, .Net FrameWork 2.0 и FastReport.Net текущей версии (от 26.11.2009).

    Для того, чтобы появилась возможность работы с Oracle используем файл FasrReport.Oracle.dll.
    Файл был получен путем исполнения проекта, скаченного с официального сайта. Затем dll была добавлена в плагины проекта Fast Report и скопирована в корневой каталог Fast Report.

    Но строка "Подключение к Oracle" в списке возможных подключений не появилась и, соответственно, никакие отчеты, которые обращаются к Oracle не работают.

    Подскажите, в чем может быть проблема?

    Замечание: Запуск проекта для генерации dll был выполнен на другой машине. Это как то влияет на работоспособность FasrReport.Oracle.dll?
  • отредактировано 13:50
    Здравствуйте,

    Необходимо перекомпилировать проект FastReport.Oracle именно с той версией FastReport.dll, с которой он будет работать.
  • ListopadListopad Хабаровск
    отредактировано 13:50
    AlexTZ написал: »
    Здравствуйте,

    Необходимо перекомпилировать проект FastReport.Oracle именно с той версией FastReport.dll, с которой он будет работать.

    Скажите, а нельзя сразу с новой версией FastReport.Net выкладывать FastReport.Oracle.dll и dll для других подключений? Я думаю, что это сократило бы проблемы, связанные с компиляцией проекта для создания dll.
  • отредактировано 13:50
    Это еще больше увеличило бы проблемы. Существуют разные версии библиотек провайдеров данных. Например, Oracle ODP.NET у нас версии 2.111.7.20, а у Вас может быть старше, или свежее.
  • ListopadListopad Хабаровск
    отредактировано 13:50
    Теперь новая проблема....

    Я поставила новую версию FastReport и получила новый файл FastReport.Oracle.dll с помощью новой FastReport.dll. В результате перестали работать все отчеты, которые используют в своих запросах подзапросы. Текст запроса формируется в обработчике события кнопки OK. Раньше (со старой версией) все работало прекрасно.

    Затем я удалила новую версию и поставила старую. Получила опять новый файл FastReport.Oracle.dll для староой FastReport.dll. Теперь вообще ничего не работет. Он ругается на функции ToDouble и IIF, которые используются на странице отчета: "The name 'ToDouble' does not exist in the current context"...

    Вопрос: что не так я делаю?
  • отредактировано 13:50
    написал:
    В результате перестали работать все отчеты, которые используют в своих запросах подзапросы.

    FastReport никак не обрабатывает текст запроса. Он просто передает его в соответствующий DataAdapter (в данном случае - в OracleDataAdapter). Каким образом перестали работать отчеты? Выдается какая-то ошибка?
  • ListopadListopad Хабаровск
    отредактировано 13:50
    AlexTZ написал: »
    FastReport никак не обрабатывает текст запроса. Он просто передает его в соответствующий DataAdapter (в данном случае - в OracleDataAdapter). Каким образом перестали работать отчеты? Выдается какая-то ошибка?

    У меня есть запрос с подзапросом (например: select * from (select * from table1 where <условие1>) where <условие2>).
    Если я пишу этот запрос в визуальном режиме (в мастере запроса), то он пишет, что у меня неверный синтаксис или отсутствует кавычка. А если я формирую текст запроса в обработчике кнопки OK:

    TableDataSource data = Report.GetDataSource("название запроса/таблицы, созданной на основе запроса с помощью мастера)") as TableDataSource;
    data.SelectCommand = "текст запроса с подзапросом";

    то все работало прекрасно.

    Теперь, после установки новой версии, при нажатии на кнапку предварительный просмотр выдается такая же ошибка, как если бы я писала запрос в масетер запросов - неверный синтаксис или отсутствует кавычка...

    Я уже запуталась и ничего не могу понять...

    OracleDataAdapter насколько я понимаю работает всегда, если фреймворк установлен. Или нет?
  • отредактировано 13:50
    Сдается мне, FastReport тут ни при чем. Если он пишет про неверный синтаксис - значит, проблема в тексте SQL. Я прикрепляю простой тестовый проект - попробуйте вбить туда свою строку подключения и SQL.
  • отредактировано 13:50
    Еще один вопрос: в FRNetConnections.zip есть два коннектора к ораклу. Стандартный - в папке FastReport.Oracle, и на основе оракловской библиотеки - FastReport.OracleODP. Каким Вы пользуетесь?
  • ListopadListopad Хабаровск
    отредактировано 13:50
    Я использую стандартный коннектор FastReport.Oracle. А прикрепленный проект я вообще открыть не смогла. у него какое расширение должно быть?

    Запрос рабочий. Запустила его в Оракле через SQL Navigator - все работает...
  • ListopadListopad Хабаровск
    отредактировано 13:50
    Код формирования запроса:
    TableDataSource data = Report.GetDataSource("Table") as TableDataSource;
    data.SelectCommand = "select * from (select street_name, home_nomer from home_address where rep_month = '200910')";

    Вылетает ошибка:
    FastReport.Net v1.2.76
    Syntax Error: Expecting identifier or quoted identifier.
    at System.Data.OracleClient.DbSqlParser.Parse2(String statementText)
    at System.Data.OracleClient.OracleDataReader.FillSchemaTable(DataTable schemaTable)
    at System.Data.OracleClient.OracleDataReader.GetSchemaTable()
    at System.Data.ProviderBase.SchemaMapping..ctor(DataAdapter adapter, DataSet dataset, DataTable datatable, DataReaderContainer dataReader, Boolean keyInfo, SchemaType schemaType, String sourceTableName, Boolean gettingData, DataColumn parentChapterColumn, Object parentChapterValue)
    at System.Data.Common.DataAdapter.FillSchemaFromReader(DataSet dataset, DataTable datatable, SchemaType schemaType, String srcTable, IDataReader dataReader)
    at System.Data.Common.DataAdapter.FillSchema(DataTable dataTable, SchemaType schemaType, IDataReader dataReader)
    at System.Data.Common.DbDataAdapter.FillSchemaInternal(DataSet dataset, DataTable datatable, SchemaType schemaType, IDbCommand command, String srcTable, CommandBehavior behavior)
    at System.Data.Common.DbDataAdapter.FillSchema(DataTable dataTable, SchemaType schemaType, IDbCommand command, CommandBehavior behavior)
    at System.Data.Common.DbDataAdapter.FillSchema(DataTable dataTable, SchemaType schemaType)
    at FastReport.Data.DataConnectionBase.FillTableSchema(DataTable table, String selectCommand, CommandParameterCollection parameters)
    at FastReport.Data.DataConnectionBase.CreateTable(TableDataSource source)
    at FastReport.Data.TableDataSource.InitSchema()
    at FastReport.Data.DataSourceBase.Init(Relation relation, String filter, SortCollection sort)
    at FastReport.Data.DataSourceBase.Init(DataSourceBase parentData, String filter, SortCollection sort)
    at FastReport.DataBand.InitDataSource()
    at FastReport.Engine.ReportEngine.1GPpYtHLZ(DataBand )
    at FastReport.Engine.ReportEngine.cAirvlDgJK(BandCollection )
    at FastReport.Engine.ReportEngine.pSgrSWshrY(ReportPage )
    at FastReport.Engine.ReportEngine.j3Yrcq3Ylm()
    at FastReport.Engine.ReportEngine.3Wvvvrefl(ReportPage )
    at FastReport.Engine.ReportEngine.YbDkpa6gH(Boolean , Boolean , ReportPage )
    at FastReport.Report.Prepare(Boolean append)
    at FastReport.Report.Prepare()
    at Amd140Cl7TpdHtxdRZu.MWt5XmCLmAnZKvhdqPV.7XwPCKxrw()

    А вот этот запрос не вызывает ошибок: select street_name, home_nomer from home_address where rep_month = '200910'
  • отредактировано December 2009
    Расширение у аттача - zip. Firefox открывает нормально, а вот в IE8 - проблемы.
    Попробуйте скачать отсюда:
    http://www.fast-report.com/pbc_download/files/OraTest.zip
  • отредактировано 13:50
    Похоже, это проблема стандартного System.Data.OracleClient.
    http://support.microsoft.com/kb/892464

    Проект OraTest.zip будет работать в том виде, в каком он есть. Ошибка будет, если заменить код (вместо Fill использовать FillSchema):
        private void button1_Click(object sender, EventArgs e)
        {
          DataTable table = new DataTable();
          using (OracleConnection conn = new OracleConnection())
          {
            conn.ConnectionString = tbConnection.Text;
            conn.Open();
    
            using (OracleDataAdapter adapter = new OracleDataAdapter(tbSql.Text, conn))
            {
              adapter.FillSchema(table, SchemaType.Source);
            }
          }
    
          dataGridView1.DataSource = table;
        }
    

    К сожалению, метод FillSchema необходим в FastReport.
  • отредактировано 13:50
    В качестве решения проблемы могу посоветовать следующее:

    а) не использовать вложенные запросы. Не очень хороший вариант - я читал, что у стандартного адаптера есть проблемы и с некоторыми простыми запросами;
    б) вместо стандартного адаптера использовать оракловский из комплекта Oracle ODAC. Для него есть фастрепортовская обертка в папке FastReport.OracleODP. Вложенные запросы при этом работают корректно.
  • ListopadListopad Хабаровск
    отредактировано 13:50
    Проект с моим запросом работает прекрасно.

    Значит проблема не в OracleClient...
  • отредактировано December 2009
    См. два моих сообщения выше.
  • ListopadListopad Хабаровск
    отредактировано 13:50
    AlexTZ написал: »
    См. два моих сообщения выше.

    С FillSchema выдается та же ошибка...
    Попробуем скачать ODP.NET...
  • ListopadListopad Хабаровск
    отредактировано 13:50
    Нашла Oracle 11g ODAC с Oracle Data Provider for .NET 2.0 11.1.0.7.20.
    А с какой минимальной версией Oracle это будет работать? С 11? Что делать, если у меня версия Oracle старше?
  • отредактировано 13:50
    Это уже вопрос не ко мне, извините. Могу сказать только, что на Oracle XE 10g ставится и работает.
  • ListopadListopad Хабаровск
    отредактировано 13:50
    Ну ладно, будем разбираться. Спасибо за помощь)
  • отредактировано 13:50
    Listopad написал: »
    Нашла Oracle 11g ODAC с Oracle Data Provider for .NET 2.0 11.1.0.7.20.
    А с какой минимальной версией Oracle это будет работать? С 11? Что делать, если у меня версия Oracle старше?

    Oracle Data Access Components (ODAC) for Windows Installation Instructions
    32-bit Release 11.1.0.7.20
    System Requirements
    Access to an Oracle Database Server (Oracle 9i Release 2 or later)

    Рекомендую использовать именно ODP.NET.
    Больше возможностей и меньше проблем по сравнению с провайдером от Microsoft.
    Я использовал версию 11.1.0.6.21 и 11.1.0.7.20.

    Кроме того, используйте в запросах вместо литералов параметры:
    вместо
    rep_month = '200910'
    используйте
    rep_month = :p_rep_month
    и нужное значение передавайте параметром
  • ListopadListopad Хабаровск
    отредактировано 13:50
    fantomus написал: »
    Oracle Data Access Components (ODAC) for Windows Installation Instructions
    32-bit Release 11.1.0.7.20
    System Requirements
    Access to an Oracle Database Server (Oracle 9i Release 2 or later)

    Рекомендую использовать именно ODP.NET.
    Больше возможностей и меньше проблем по сравнению с провайдером от Microsoft.
    Я использовал версию 11.1.0.6.21 и 11.1.0.7.20.

    Спасибо. У меня версия еще старше) У меня 8.1.7.0.0 )))
    Так что обойдусь без ODP.NET...

    fantomus написал: »
    Кроме того, используйте в запросах вместо литералов параметры:
    вместо
    rep_month = '200910'
    используйте
    rep_month = :p_rep_month
    и нужное значение передавайте параметром

    У меня раньще все работало... Раньше - это когда был провайдер от Microsoft.

    Так что я поставила снова старую версию FastReport.Net Win+WebForms Single license 1.1 (стабильная версия) 2009-05-29. С этой версией у меня работало все. Даже подзапросы. Никаких проблем не возникало, пока я не поставила новую версию программы.
    Теперь возникли проблемы с функциями - они вообще пропали. Их нет в панеле инструментов Данные. И когда я запускаю отчет с функциями FastReport ругается на функции. У меня к примеру используются IIf и ToDouble.

    Как в старую версию вернуть функции? )))
  • отредактировано 13:50
    Функции появились начиная с версии 1.2.
  • ListopadListopad Хабаровск
    отредактировано 13:50
    AlexTZ написал: »
    Функции появились начиная с версии 1.2.

    Перепробовала все ранее скаченные версии. И в одной из них все заработало - и подзапросы, и функции. Это версия FastReport.Net Win+WebForms Single license 1.1 (текущая версия) 2009-08-07. Так что видимо функции все же появились раньше, чем в версии 1.2.

  • отредактировано 13:50
    Listopad написал: »
    Спасибо. У меня версия еще старше) У меня 8.1.7.0.0 )))
    Так что обойдусь без ODP.NET...
    Oracle Data Access Components (ODAC) for Windows
    32-bit Release 10.2.0.2.21
    System Requirements
    Access to an Oracle Database Server (Oracle8i Release 3 or later)
    Можно взять и более старую версию.
    Все будет работать.
    Listopad написал: »
    У меня раньще все работало... Раньше - это когда был провайдер от Microsoft.
    Возможно это была счастливая случайность...
    А по поводу параметров запросов хорошо подумайте.
    Вы можете наступить на грабли, на которые уже наступили все разаработчики под Оракл.
    Использование динамического формирования sql без связывания параметров, ухудшает производительность сервера.
    Это, конечно, зависит от количества запросов и настроек сервера...

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.