c# - 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();
解决方案
推荐阅读
- java - 静态如何影响同步方法?
- spring - 覆盖@MessagingGateway 中配置的errorChannel
- reporting-services - SSRS - 独特价值总计
- amazon-web-services - Terraform aws_spot_fleet_request iam_instance_profile
- jsp - jsp的request.setAttribute中可以存储的最大数据限制?
- python - time.sleep 仅用于无限 while 循环内的一部分代码
- javascript - Javascript - 对象引用返回 null,即使它不应该
- hyperledger-fabric - Instantiate chaincode from Java SDK
- r - 将 SPSS 数据作为数据框导入 R 的最快方法
- css - Angular ngcontent 搞乱了引导风格