2012-03-12 4 views
4

У меня есть веб-приложение asp.net/C#, работающее в среде Windows. Проект строит отлично и отлично работает на сервере разработки VB.net моей локальной машины.Ошибка Oracle.DataAccess

Однако, когда я публикую на реальный сервер приложений я получаю следующее сообщение об ошибке:

[OracleException (0x80004005): Поставщик не совместим с версией клиента Oracle] [TypeInitializationException: Тип инициализатора для 'Oracle.DataAccess.Client.OracleConnection' выбрал исключение.]

В настоящее время версия этого приложения работает нормально, я тестирую на реальном сервере в другом каталоге. Я даже попытался вырвать Oracle.DataAccess .dll из рабочего приложения, но все равно получить то же сообщение об ошибке.

+0

Я где-то читал на форуме, что могу указать свой файл web.config на набор мгновенных DLL-файлов oracle. Я не уверен, что это было бы полезно. – Baxter

+0

Кроме того, я охочусь за версией oracle.dataaccess версии 2.112.2.0, которая является версией, установленной на GAC сервера. – Baxter

+0

Варианты сборки клиента Oracle могут быть установлены в файле machine.config. Вы можете проверить это. –

ответ

12

Во-первых: Оракул клиент/поставщик беспорядок. И это касается как MS, так и амортизатора, а также Oracle.

Для того, чтобы подключиться к БД Oracle через провайдера ODP.NET три вещи, которые должны быть установлены правильно:

  • Oracle клиент должен быть настроен должным образом (не имеет ничего общего с провайдером .NET, это относится к установленному клиенту oracle, обычно в c: \ oracle)
  • Поставщик ODP.NET должен быть совместим с установленным клиентом Oracle
  • Архитектура клиента и поставщика и ваше приложение должны соответствовать, вы не можете использовать 64-битный клиент с поставщиком/приложением x86 и наоборот.

Обычно лучше всего иметь новейшую версию обоих. Но если вы хотите избавиться от этой проблемы раз и навсегда, используйте сторонний поставщик oracle .NET.

UPDATE

Один из них лучше от DataDirect (не принадлежность):
http://www.datadirect.com/products/net/net-for-oracle/index.html

Это не просто установка (без оракул клиента необходимо), но это также быстрее, полностью управляемый, x64 и общая поддержка - это путь, который лучше, чем то, что вы получаете с ODP.NET. Это будет стоить вам, хотя.

DevArt один довольно приличный, а также (и много гораздо дешевле):
http://www.devart.com/dotconnect/oracle/

Мы решили для DataDirect по причинам расширяемости, это не должно иметь отношение к вам, однако.

Здесь вы можете найти хорошую подборку третьих лиц, которые строят .NET поставщиков, не ограничиваясь оракула, хотя:
http://msdn.microsoft.com/en-us/data/dd363565

+0

Можете ли вы порекомендовать хороший сторонний поставщик oracle .NET? – Baxter

+1

Обновлен мой ответ двумя образцами и общей ссылкой. – ntziolis

1

я наткнулся на тот же сценарий, прежде чем

Чтения это может помочь вам, как некоторые ODAC Oracle for .NET

о вашей проблеме в вашем сервере вы должны установить весь ODAC клиента от оракула

последней версии сейчас 4.xx

я установил его и все работает как шарм

надеюсь, что это помогает :)

Заботиться

+0

Вам не нужно устанавливать все это. Вы можете сохранить объем памяти на уровне 140 МБ, если вы просто установите необходимые файлы. – Alex

1

Я был в состоянии решить эту проблему путем поиска Oracle.DataAccess.dll на прод сервер. Поэтому вместо того, чтобы пытаться построить/развернуть проект с помощью Oracle.DataAccess.dll из моей среды разработки, я скопировал DLL-файл из каталога клиента oracle prod-сервера и включил его в качестве ссылки. Я также установил свойства .dll «Копировать локальное = истинное» и «Специфическая версия» = true. Таким образом, похоже, что существует несоответствие между версией клиента oracle на моем dev-сервере и prod-сервере.

1
Equals, with Oracle.DataAccess.dll Works!!!! 
//using Oracle.DataAccess.Client 

object pdf = null; 

var queryString [email protected]"SELECT PDF FROM DIGITAL WHERE ID_DIGITAL=1001" ; //example 
var ctx = new Entities(); 
var entityConn = ctx.Connection as EntityConnection; 

if (entityConn != null) 
{ 
var dbConn = entityConn.StoreConnection as OracleConnection; 
dbConn.Open(); 

var cmd = new OracleCommand(queryString, dbConn); 
using (var reader = cmd.ExecuteReader()) 
{ 
while (reader.Read()) 
{ 
pdf = reader[0]; 
} 
} 
dbConn.Close(); 
} 
return pdf; 
0

В дополнение к другим предложениям просто попробуйте запустить Visual Studio в качестве администратора.

Я потратил много времени на общение с GAC и различными версиями Oracle.DataAccess.dll, и в итоге просто работал VS, поскольку администратор запустил его для запуска.

Смежные вопросы