【问题标题】:Query throwing exception when called from C# Code从 C# 代码调用时查询抛出异常
【发布时间】:2018-08-20 18:43:57
【问题描述】:

我的存储过程中有以下查询

SELECT * INTO my_table FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0',''Data Source=C:\TEMP_EXCEL\sheet.xls;Extended Properties=Excel 12.0'')...Sheet1$]

在管理工作室运行时运行良好,但从 C# 代码调用时抛出以下错误。

System.Data.SqlClient.SqlException (0x80131904):请求的操作无法执行,因为 OLE DB 提供程序 链接服务器“(null)”的“Microsoft.ACE.OLEDB.12.0”不支持 所需的事务接口。 Microsoft.ACE.OLEDB.12.0

我设置了以下配置值

EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
GO 
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1
GO

还有这个

sp_configure 'show advanced options', 1;**
GO
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;**
GO
RECONFIGURE;
GO

我已经搜索过这个解决方案,但似乎所有人都在讨论如何让它在 SQL 中运行。

任何帮助将不胜感激

【问题讨论】:

  • 你的代码在哪里可以从 c# 中完成?您是否有理由不只是通过 OleDb 直接连接到 Excel 工作表?
  • 使用 32bit / 64bit / Any CPU for C# - 很可能你的架构看不到你安装的驱动程序
  • @RowlandShaw 我需要将批量数据导入数据库表,这就是我在 sqlserver 上执行此操作的原因。 Lanorkin 你所说的建筑是什么意思?请解释一下。
  • @Imran: 尝试使用 OPENROWSET 而不是 OPENDATASOURCE ?像这样的东西 - SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0; Database=C:\TEMP_EXCEL\sheet.xlsx; Extended Properties=''EXCEL 12.0;HDR=NO;IMEX=1', 'SELECT * FROM [Sheet1$]') 是的,还向我们展示你的 C# 代码......
  • @Imran:如果您的选择语句有效,那么我认为您需要编写类似这样的查询 - Insert INTO my_table(col1, col2) SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0; Database=C:\TEMP_EXCEL\sheet.xlsx; Extended Properties=''EXCEL 12.0;HDR=NO;IMEX=1','SELECT col1, col2 FROM [Sheet1$]')

标签: c# sql sql-server


【解决方案1】:

我找到了解决问题的方法。如错误中所述:

链接服务器“(null)”的“Microsoft.ACE.OLEDB.12.0”不支持所需的事务接口。 Microsoft.ACE.OLEDB.12.0"

链接服务器不支持所需的事务接口,我忘了提到在存储过程中我在事务中有这个查询,它需要提到事务隔离级别,所以我添加了 "READ COMMITTED” 到我的查询中,无论是默认的,它都不能正常工作,它解决了我的问题。

谢谢大家。非常感谢您的时间。

【讨论】:

  • 对于其他阅读者,我在我的 SP 顶部添加了以下内容:SET TRANSACTION ISOLATION LEVEL READ COMMITTED
【解决方案2】:

这是一个老问题,但在我们意外升级现有代码以使用 EF 6.1.2 后出现此错误 我们的解决方法是在调用任何存储过程之前将 EnsureTransactionsForFunctionsAndCommands 设置为 false:

 using (Ef6Context db = NewContext())
 {
     db.Configuration.EnsureTransactionsForFunctionsAndCommands = false;
     // Call an imported SP
 } 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 2020-03-12
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多