【问题标题】:OLE DB provider 'OraOLEDB.Oracle' cannot be used for distributed queriesOLE DB 提供程序“OraOLEDB.Oracle”不能用于分布式查询
【发布时间】:2014-11-13 16:58:57
【问题描述】:

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

System.Data.SqlClient.SqlException:OLE DB 提供程序“OraOLEDB.Oracle” 不能用于分布式查询,因为提供者是 配置为在单线程单元模式下运行。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常, 布尔中断连接)在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔型 breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior、SqlCommand cmdHandler、SqlDataReader 数据流、 BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 在 System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 在 System.Data.SqlClient.SqlDataReader.get_MetaData() 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior,字符串 resetOptionsString) 在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior、RunBehavior runBehavior、布尔 returnStream、布尔 异步)在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior、runBehavior、布尔返回流、字符串 方法,DbAsyncResult 结果)在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior、runBehavior、布尔返回流、字符串 方法)在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,字符串方法)在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior 行为)在 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior 行为)在 System.Data.Common.DbDataAdapter.FillInternal(DataSet 数据集,DataTable[] 数据表,Int32 startRecord,Int32 maxRecords, 字符串 srcTable、IDbCommand 命令、CommandBehavior 行为)在 System.Data.Common.DbDataAdapter.Fill(数据集数据集,Int32 startRecord,Int32 maxRecords,String srcTable,IDbCommand 命令, CommandBehavior 行为)在 System.Data.Common.DbDataAdapter.Fill(数据集数据集,字符串 srcTable)

【问题讨论】:

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


【解决方案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 分布式事务协调器)的挂钩

【讨论】:

    猜你喜欢
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多