这里是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) .

我到底做错了什么?

推荐答案

正如其他人在 comments 中提到的,Context Connection不能与SqlBulkCopy一起使用,正如文档-Context Connections and Regular Connections - Restrictions中所指出的(由@Alway sLearning注明).需要标准连接字符串.

然而,文档和 comments 只是部分正确的.上下文连接仅对destination连接无效.另一方面,它对source连接有效.这在这里没有帮助,因为有问题的连接是目的地,但它仍然应该被记录下来(如果我有机会,我会更新Microsoft文档,更具体地).

.net相关问答推荐

AutoMapper在实体框架查询后不知从哪里带来数据

图像 UriSource 和数据绑定

单击关闭按钮时隐藏表单而不是关闭

如何从标头中检索基本身份验证凭据?

整个命名空间的SuppressMessage

异步总是 WaitingForActivation

图像与位图类

数据库架构更改后更新 LINQ to SQL 类的最佳方法

Java 和 .NET 技术/框架的类似物

在安全处理异常时避免首次机会异常消息

什么版本的 .NET 附带什么版本的 Windows?

如何在 C# 中仅设置 DateTime 变量的时间部分

System.Speech.Recognition 和 Microsoft.Speech.Recognition 有什么区别?

如何在 C# 中以编程方式安装 Windows 服务?

场与财产.性能优化

C# (.NET) 设计缺陷

如何访问 Session 变量并在 javascript 中设置它们?

是否可以判断对象是否已附加到实体框架中的数据上下文?

在 C# 中转义无效的 XML 字符

C# ListView 列宽自动