首页 > 解决方案 > TSQL存储过程导入excel数据

问题描述

我创建了一个查询以将大型 excel 文件中的数据导入 SQL Server 表。当我将它作为一个简单的查询执行时,它运行良好,当我从 SSMS 作为存储过程执行它时,它也运行良好。当我从 C# 应用程序执行 SP 时,SQL Server 返回以下错误:

无法为链接服务器“(null)”初始化 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”的数据源对象。

有趣的是,我不小心在 SP 中留下了一个调试打印语句,而 SQL Server 也将 SQL 语句返回给我的应用程序。如果我将其复制并粘贴到 SSMS 中,查询就会运行。

CREATE PROCEDURE [dbo].[sp_DataImporter]
   @SheetName varchar(20),
   @FilePath varchar(100),
   @TableName varchar(50)
AS
BEGIN
    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
      SET @SQL = 'SELECT * 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'''''')'

    EXEC sp_executesql @SQL
END
GO

如前所述,如果我只是在查询窗口中运行它,它运行得很好:

insert INTO Table SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
                         'Excel 12.0;Database=C:\Users\folder\folder\folder\folder\name.xlsx',
                          'SELECT * FROM [Sheet$] Where [Column] = ''Value'' AND [Column] =''Value'' AND  [Column] = ''Value''')

C# 代码

string _connection = ConfigurationManager.ConnectionStrings["_conn"].ConnectionString;
            string query = report;

            SqlConnection conn = new SqlConnection(_connection);
            SqlCommand cmd = new SqlCommand(query, conn);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@FilePath", fileName);
            cmd.Parameters.AddWithValue("@SheetName", sheetname);
            cmd.Parameters.AddWithValue("@TableName", tableName);

            conn.Open();
            cmd.ExecuteNonQuery();
            conn.Close();

标签: c#exceltsqllinked-serveropenrowset

解决方案


推荐阅读