TSQL存储过程导入Excel数据 C#调用时OLE DB Provider初始化报错
问题解决方案
核心原因:SSMS执行SQL时使用的是你登录SSMS的账号权限,而C#调用存储过程时使用的是连接字符串指定的账号/应用运行身份的权限,二者权限不一致导致OPENROWSET初始化ACE驱动失败。可按以下步骤逐一排查解决:
1. 配置SQL Server分布式查询和ACE驱动权限
在SSMS中执行以下SQL,启用必要的驱动配置:
-- 开启高级配置选项 sp_configure 'show advanced options', 1; RECONFIGURE; GO -- 启用即席分布式查询 sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE; GO -- 允许ACE驱动在SQL Server进程中运行 EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1; GO -- 开启ACE驱动动态参数支持 EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1; GO
2. 修复存储过程语法错误
你提供的存储过程中SELECT INTO分支多写了重复的SELECT *,会导致执行出错,修正后逻辑如下:
CREATE PROCEDURE [dbo].[sp_DataImporter] @SheetName varchar(20), @FilePath varchar(100), @TableName varchar(50) AS BEGIN SET NOCOUNT ON; DECLARE @SQL nvarchar(1000) IF OBJECT_ID (@TableName,'U') IS NOT NULL SET @SQL = 'INSERT INTO [' + @TableName +'] SELECT * FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'', ''Excel 12.0;Database=' + @FilePath + ''', ''SELECT * FROM [' + @SheetName + '] Where [Column] = ''''Value'''' AND [Column] =''''Value'''' AND [Column] = ''''Value'''''')' ELSE -- 移除多余的SELECT * SET @SQL = 'SELECT * INTO [' + @TableName +'] FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'', ''Excel 12.0;Database=' + @FilePath + ''', ''SELECT * FROM [' + @SheetName + '] Where [Column] = ''''Value'''' AND [Column] =''''Value'''' AND [Column] = ''''Value'''''')' EXEC sp_executesql @SQL END GO
3. 检查文件访问权限
你使用的Excel文件路径默认在用户个人目录下,SQL Server服务默认运行身份(Network Service/本地系统)没有访问权限,做以下调整:
- 将Excel文件移动到非用户个人目录的公共文件夹,比如
D:\ExcelImport\ - 给该文件夹添加权限:允许SQL Server服务运行账号、以及C#应用连接SQL使用的账号拥有「读取、写入、修改」权限
- 确认ACE驱动版本和SQL Server版本匹配:64位SQL Server安装64位ACE驱动,32位SQL Server安装32位ACE驱动,不要混装。
4. 授权SQL账号批量操作权限
如果C#连接字符串使用SQL账号登录(非Windows集成验证),给该账号授予批量操作权限:
GRANT ADMINISTER BULK OPERATIONS TO [你的SQL登录账号]; GO
如果使用Windows集成验证,确认C#应用的运行身份(比如桌面程序的当前登录用户、IIS站点的应用程序池标识)有Excel文件访问权限,同时在SQL Server中拥有对应登录身份和存储过程执行权限。
5. 调试验证
可在存储过程中增加日志逻辑,输出拼接后的@SQL语句和当前执行用户SUSER_SNAME(),确认C#传入的文件路径、Sheet名参数正确,没有转义错误。
内容的提问来源于stack exchange,提问作者user2219930
相关产品推荐
相关产品推荐

