使用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必须依赖常规独立数据库连接才能正常工作。
具体解决步骤:
修改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身份验证连接字符串。重新编译生成DLL
修改代码后重新编译项目,生成更新后的DLL文件。更新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

