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

使用CLR将Excel导入SQL Server报错:上下文连接不支持该操作

问题描述

我是一名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'

时,收到如下错误信息:

Msg 6522, Level 16, State 1, Procedure dbo.readExcel, Line 0 [Batch
Start Line 46] A .NET Framework error occurred during execution of
user-defined routine or aggregate "readExcel":
System.InvalidOperationException: The requested operation is not
available on the context connection. System.InvalidOperationException:
at System.Data.SqlClient.SqlBulkCopy.CreateOrValidateConnection(String
method) at
System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32
columnCount, CancellationToken ctoken) at
System.Data.SqlClient.SqlBulkCopy.WriteToServer(DbDataReader reader)

at StoredProcedures.ExcelTransfer(String FileName, String WorkBook,
String TableName) .

请问我哪里操作出错了?

问题原因与解决方法

错误核心是**SqlBulkCopy不支持使用上下文连接(context connection = true)**。上下文连接是SQL CLR中用于直接访问当前SQL Server会话的特殊连接,而SqlBulkCopy必须依赖常规独立数据库连接才能正常工作。

具体解决步骤:

  1. 修改C#代码的连接逻辑
    替换原有的上下文连接为常规SQL Server连接字符串,示例如下:

    // 注释或删除原上下文连接代码
    // using (SqlConnection cn = new SqlConnection("context connection = true"))
    // 改为常规连接(根据实际环境调整):
    using (SqlConnection cn = new SqlConnection("Server=.;Database=你的目标数据库名;Integrated Security=True;"))
    {
        cn.Open();
        // 后续Excel读取、BulkCopy代码保持不变
    }
    

    注意:需将你的目标数据库名替换为实际数据库名称,也可根据需求改用SQL身份验证连接字符串。

  2. 重新编译生成DLL
    修改代码后重新编译项目,生成更新后的DLL文件。

  3. 更新SQL Server中的程序集
    执行SQL语句替换原程序集:

    ALTER ASSEMBLY ImportFromFile_XLS
    FROM '<更新后的DLL文件路径>'
    WITH PERMISSION_SET = UNSAFE
    GO
    

额外注意事项:

  • 确保SQL Server服务账户拥有目标Excel文件(C:\SQL_DATA\WorkBook.xls)的读取权限,否则会触发文件访问错误。
  • 服务器需安装Microsoft.ACE.OLEDB.12.0驱动,且要匹配SQL Server的位数(64位SQL Server需安装64位ACE驱动)。

内容的提问来源于stack exchange,提问作者Stackoverflowuser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:05:32