2014-09-19 2 views
-1

Получение следующей ошибки при попытке выполнить Oracle SP в ASP.NET. Здесь нет концепции Linked Server. Я напрямую подключаюсь к Oracle с использованием соединения Oracle.Поставщик OLE DB «OraOLEDB.Oracle» не может использоваться для распределенных запросов

System.Data.SqlClient.SqlException: поставщик OLE DB «OraOLEDB.Oracle» не могут быть использованы для распределенных запросов, поскольку провайдер настроен для работы в режиме однопоточных квартиры. на System.Data.SqlClient.SqlConnection.OnError (SqlException исключения, Логического breakConnection) при System.Data.SqlClient.SqlInternalConnection.OnError (SqlException исключения, булева breakConnection) при System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj) при System.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) при System.Data.SqlClient.SqlDataReader.ConsumeMetaData() в System.Data .SqlClient.SqlDataReader.get_MetaData() в System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDa taReader DS, RunBehavior runBehavior, String resetOptionsString) на System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, булева returnStream, булева асинхронной) на System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, runBehavior runBehavior, булева returnStream, String метод, DbAsyncResult результат) на System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, runBehavior runBehavior, булева returnStream, String метод) при System.Data.SqlClient.SqlCommand .ExecuteReader (поведение CommandBehavior , метод String) в System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (CommandBehavior поведение) при System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader (CommandBehavior поведение) при System.Data.Common.DbDataAdapter.FillInternal (DataSet Набор данных DataTable [] DataTables, Int32 startRecord, Int32 MaxRecords, Строка srcTable, IDbCommand команда, поведение CommandBehavior) при System.Data.Common.DbDataAdapter.Fill (DataSet DataSet, Int32 startRecord, Int32 MaxRecords, Строка srcTable, IDbCommand команду , Поведение CommandBehavior) на System.Data.Common.DbDataAdapter.Fill (DataSet dataSet, String srcTable)

+0

[Ошибка распределенной транзакции] (http://stackoverflow.com/questions/6999906/distributed-transaction -error) и [Невозможно начать распределенную транзакцию] (http://stackoverflow.com/questions/7473508/unable-to-begin-a-distributed-transaction) – bummi

ответ

1

«OraOLEDB.Oracle» - это общая реализация для подключения к различным базам данных из технологии MS. Это реализация STA (Single threaded Apartment) в COM, поэтому, когда внутренне ваш код пытается создать другой поток для распределенного запроса, он генерирует исключение, поскольку STA не является надежной реализацией потоков. Процессы .Net - это MTA (Multi threaded Apartment), что означает, что они могут обрабатывать несколько потоков за один раз. Проверьте эти ссылки для получения дополнительной информации:

Could you explain STA and MTA?

Single-Threaded Apartments vs Multi-Threaded Apartments

Лучший вариант для вас будет переходить к ODP.Net, который является чистым продуктом .Net и не будет таких проблем. Он имеет встроенную поддержку распределенных запросов/транзакций, поддерживаемых Oracle.Фактически вы использовали бы ORAMTS для этой цели, которая является крюком Oracle для MSDTC (распределенный координатор транзакций MS)