2012-04-11 2 views
2

Я пытаюсь получить простую концептуальную концепцию, использующую пробную версию dotConnect для Devart для Oracle, потому что в настоящее время мы используем инфраструктуру .Net Framework OracleClient (из-за устаревания) но у нас также есть требование подключиться без необходимости в Oracle Client или даже Instant Client. По этой причине я пытаюсь доказать своему боссу, что dotConnect - это инструмент для работы, учитывая его прямой режим и способность работать с Enterprise Library 5 (используется на нашем уровне доступа к данным). Я следил за примерами, представленными Devart, включая добавление карты пользовательского провайдера в app.config в тестовом приложении. Все это, казалось, работало на моей машине разработки как в IDe, так и в виде скомпилированного приложения, поэтому я включил его в простой проект и проект развертывания, построил msi, а затем установил его на виртуальной машине Win7 Win 7 x86, которая не не требуется установить клиент Oracle для проверки.Devart dotConnect Для сопоставлений пользовательских поставщиков Oracle и Enterprise Library

Он просто не хочет работать. Тест выполняет простой оператор select и отображает результаты в списке (если они есть - вы получаете сообщение, если нет). На самом деле я не беспокоился о самих результатах, а просто о получении их. Проблема заключается в том, когда я выполнить тест я получаю когда-либо бесполезные ошибки EL:

Activation error occured while trying to get instance of type Database, key "Testing26_devart" 

Вот виновный строка кода:

Dim db As Database = EnterpriseLibraryContainer.Current.GetInstance(Of Database)(EnvironmentName) 

Вот отображение провайдера в файле app.config:

<add databaseType="Devart.Data.Oracle.EnterpriseLibrary.OracleDatabase, Devart.Data.Oracle.EnterpriseLibrary, Version=3.5.4456.40828, Culture=neutral, PublicKeyToken=null" name="Devart.Data.Oracle" /> 

Вот строка соединения с app.config:

<add name="Testing26_devart" connectionString="User Id=Testing26;Password=Testing26;Server=ORACLE-SERVER;Direct=True;Sid=DEVORA;Port=1523;" 
     providerName="Devart.Data.Oracle" /> 

Я знаю, что эта ошибка может быть вызвана неправильным именем строки подключения (между прочим), но я знаю, что это правильно, потому что я извлекаю ее из файла конфигурации в первую очередь. Также это точно так же, как конфигурация, используемая в среде разработки. Внутреннее исключение заключается в следующем:

Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "Microsoft.Practices.EnterpriseLibrary.Data.Database", name = "Testing26_devart". 

Exception occurred while: while resolving. 

Exception is: InvalidOperationException - The type Database cannot be constructed. You must configure the container to supply this value. 

Я подозреваю, что отображение провайдер виноват, потому что если я изменить поставщика в строке подключения к System.Data.OracleClient, то он не имеет никаких проблем найти строку подключения, но вместо этого жалуется на неподдерживаемый ключевое слово Direct (из переключателя режима dotConnect Direct), что имеет смысл.

Я не вижу, что я сделал неправильно в отношении картографирования провайдера. Я не использовал его раньше, но я использовал инструмент настройки EL для обеспечения его правильности, пользовательская библиотека включена в исполняемый файл (и другие библиотеки EL). Я рассмотрел несколько примеров, все из которых предполагают, что у меня есть правильная конфигурация, так что я пропал без вести? Это сводит меня с ума.

ответ

2

Похоже, что DbProviderFactory не настроен. Возможно, когда вы устанавливаете программное обеспечение Devart, он устанавливает DbProviderFactory в machine.config. Проверьте файл machine.config на вашей машине разработки для существования DbProviderFactory.

Если вы не хотите изменять файл machine.config, вы можете добавить информацию о конфигурации в свой app.config. Это будет выглядеть примерно так:

<system.data> 
    <DbProviderFactories> 
     <add name="dotConnect for Oracle" invariant="Devart.Data.Oracle" 
description="Devart dotConnect for Oracle" type="Devart.Data.Oracle.OracleProviderFactory, Devart.Data.Oracle" />   
    </DbProviderFactories> 
    </system.data> 

Я не знаком с библиотеками Devart, так что я не уверен, что будет версия или PublicKeyToken.

Если корпоративная библиотека не может найти DbProviderFactory, база данных не будет зарегистрирована, и когда вы попытаетесь получить доступ к базе данных, вы получите сообщение о том, что объект не может быть найден в контейнере.

+0

Tuzo, на котором вы были на месте - установщик для dotConnect добавляет запись в файл machine.config, но не упоминает об этом нигде в документации (что я вижу), поэтому она отлично работает на машине разработки. Как только я добавил раздел в свой app.config, он взорвался и сделал то, что я ожидал. Большое вам спасибо - я потратил 2 дня, пытаясь понять, что не так, используя такие вещи, как fuslogvw, монитор процесса и многое другое. –

+0

@StevePettifer, похоже, вы не обратили внимание на эту статью в документации к продукту: http://www.devart.com/dotconnect/oracle/docs/Deployment.html. Вы можете найти всю необходимую информацию. – Devart

+0

@Devart - я прочитал этот документ, но не ясно, что вам это нужно, когда вы используете новые методы EL5 для получения экземпляров базы данных, которые (как оказалось) значительно абстрагируют DbProviderFactories, если вы этого не знаете уже. Также не говорится, что ваш установщик добавляет его в machine.config, что было ключевым недостатком. Я бы предположил, что вы не должны добавлять запись DbProviderFactories в machine.config во время установки и вместо этого указывать в документации, что она должна быть добавлена ​​в app.config/web.config (или, если это то, что хочет пользователь, machine.config) вручную. –