这里是 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(字符串文件名,字符串工作簿, 字符串表名).
我在这里做错了什么?
您的场景不需要任何 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$]);