使用 CLR 将数据从 Excel 导入到 SQL Server 时出错

问题描述 投票:0回答:1

这里是 SQL DBA,而不是 C# 或程序员。以下是我在网上找到的一些代码,并尝试适应我的需求:

public partial class StoredProcedures

{

    [Microsoft.SqlServer.Server.SqlProcedure]

    public static void ExcelTransfer(String FileName, String WorkBook, String TableName)

    {

        using (SqlConnection cn = new SqlConnection("context connection = true"))

        {

            cn.Open();

            // Connection String to Excel Workbook

            string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName + ";Extended Properties='Excel 12.0;HDR=YES'";

            // Create Connection to Excel Workbook

            using (OleDbConnection connection = new OleDbConnection(excelConnectionString))

            {

                OleDbCommand command = new OleDbCommand("Select Number FROM [" + WorkBook + "$]", connection);
                connection.Open();

                // Create DbDataReader to Data Worksheet

                using (DbDataReader dr = command.ExecuteReader())

                {

                    // Bulk Copy to SQL Server

                    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(cn))

                    {

                        bulkCopy.DestinationTableName = TableName;

                        bulkCopy.WriteToServer(dr);

以上代码在 SQL Server 中注册为:

CREATE ASSEMBLY ImportFromFile_XLS
FROM '<path to .dll>'
WITH PERMISSION_SET = UNSAFE
GO

CREATE procedure readExcel (@str1 nvarchar(255), @str2 nvarchar(255), @str3 nvarchar(255))
AS
EXTERNAL NAME ImportFromFile_XLS.StoredProcedures.ExcelTransfer

当我执行时

EXEC dbo.readExcel 'C:\SQL_DATA\WorkBook.xls', 'WorkBook', 'testTable'

我收到错误消息:

消息 6522,级别 16,状态 1,过程 dbo.readExcel,第 0 行 [批处理 开始行 46] 执行期间发生 .NET Framework 错误 用户定义的例程或聚合“readExcel”: System.InvalidOperationException:请求的操作不是 在上下文连接上可用。系统.InvalidOperationException: 在 System.Data.SqlClient.SqlBulkCopy.CreateOrValidateConnection(字符串 方法)在 System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32 columnCount、CancellationToken ctoken)位于 System.Data.SqlClient.SqlBulkCopy.WriteToServer(DbDataReader阅读器)
在 StoredProcedures.ExcelTransfer(字符串文件名,字符串工作簿, 字符串表名).

我在这里做错了什么?

.net sql-server clr sqlclr clrstoredprocedure
1个回答
0
投票

您的场景不需要任何 CLR。唯一的前提是需要安装 Microsoft ACE OLEDB 提供程序。它有 3 个版本:12.0、15.9 或 16.0。您只需要其中之一。

T-SQL

SELECT *
FROM OPENROWSET('Microsoft.ACE.OLEDB.16.0',
   'Excel 12.0 Xml; HDR=YES;
    Database=c:\...\dada.xlsx',
    [Sheet1$]);
© www.soinside.com 2019 - 2024. All rights reserved.