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要)
答案 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分布式事务协调员)的挂钩