OLE DB提供程序' OraOLEDB.Oracle'不能用于分布式查询

时间:2014-09-19 07:01:00

标签: c# asp.net sql-server oracle oledb

尝试在ASP.NET中执行Oracle SP时出现以下错误。这里没有链接服务器概念。我使用Oracle连接直接连接到Oracle。

  

System.Data.SqlClient.SqlException:OLE DB提供程序'OraOLEDB.Oracle'   因为提供者是,所以不能用于分布式查询   配置为在单线程单元模式下运行。在   System.Data.SqlClient.SqlConnection.OnError(SqlException异常,   Boolean breakConnection)at   System.Data.SqlClient.SqlInternalConnection.OnError(SQLEXCEPTION   exception,Boolean breakConnection)at   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject   stateObj)在System.Data.SqlClient.TdsParser.Run(RunBehavior   runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,   BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject   System.Data.SqlClient.SqlDataReader.ConsumeMetaData()中的stateObj)   在System.Data.SqlClient.SqlDataReader.get_MetaData()at   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,   RunBehavior runBehavior,String resetOptionsString)at   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean   async)at   System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String   方法,DbAsyncResult结果)at   System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String   方法)at   System.Data.SqlClient.SqlCommand.ExecuteReader(的CommandBehavior   行为,String方法)at   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(的CommandBehavior   行为)   System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(的CommandBehavior   在System.Data.Common.DbDataAdapter.FillInternal(DataSet。)的行为)   dataset,DataTable [] datatables,Int32 startRecord,Int32 maxRecords,   字符串srcTable,IDbCommand命令,CommandBehavior行为)at   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet,Int32   startRecord,Int32 maxRecords,String srcTable,IDbCommand命令,   CommandBehavior行为)at   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet,String   srcTable要)

1 个答案:

答案 0 :(得分:1)

' OraOLEDB.Oracle'是从MS技术连接到各种数据库的通用实现。它是COM中的STA(单线程单元)实现,因此当内部代码尝试为分布式查询生成另一个线程时,它会抛出异常,因为STA不是线程安全的实现。 .Net进程是MTA(多线程公寓),这意味着它们可以一次处理多个线程。请查看这些链接以获取更多信息:

Could you explain STA and MTA?

Single-Threaded Apartments vs Multi-Threaded Apartments

最好的选择是转移到ODP.Net,这是一个纯粹的.Net产品,不会有这样的问题。它内置了对Oracle支持的分布式查询/事务的支持。事实上,您将使用ORAMTS,这是Oracle对MSDTC(MS分布式事务协调员)的挂钩