You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:00:03