已回答 SQL服务器从Excel文件导入数据

tim8w

知名会员
已加入
2020年9月8日
留言内容
64
编程经验
10+
你好
我要输入到预定义表的Excel文件中大约有27000行。目前,我是通过调用存储过程来完成的,该存储过程将每个Excel行插入到表中。

C#:
// Open Excel Attachment
var app = new Microsoft.Office.Interop.Excel.Application();
Workbooks wbs = app.Workbooks;
wbs.Open("C:\\JDEWOData\\" + fileAttachment.Name);

Worksheet worksheet = app.ActiveSheet;
Range usedRange = worksheet.UsedRange;
bool bHeaderRow = true;

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data Source=source;Initial Catalog=FPY;User ID=PartsetupUser;Password=xxxxxxxxx";
conn.Open();
SqlCommand TrunkCommand = new SqlCommand("TRUNCATE TABLE tblJDEWOData",conn);
TrunkCommand.ExecuteNonQuery();

//Iterate 的rows in 的used range
foreach (Range row in usedRange.Rows)
{
    String[] rowData = new String[row.Columns.Count - 1];
    for (int i = 0; i < row.Columns.Count; i++)
        rowData[i] = Convert.ToString(row.Cells[1, i + 1].Value2);
    if (!bHeaderRow)
    {
        SqlCommand command = new SqlCommand();
        command.Connection = conn;
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = "dbo.ins_tblJDEWOData";
        command.Parameters.Add("WONum", SqlDbType.Int).Value = int.Parse(rowData[0]);
        command.Parameters.Add("WOType", SqlDbType.Char,2).Value = rowData[1].Trim();
        command.Parameters.Add("OpSeqNum", SqlDbType.Decimal).Value = rowData[2].Trim();
        command.Parameters[2].Precision = 20;
        command.Parameters[2].Scale = 7;
        command.Parameters.Add("CellName", SqlDbType.VarChar, 20).Value = rowData[3].Trim();
        command.Parameters.Add("BusinessUnit", SqlDbType.Char,30).Value = rowData[4].Trim();
        command.Parameters.Add("PartNum", SqlDbType.VarChar,20).Value = rowData[5].Trim();
        command.Parameters.Add("QtyCompleted", SqlDbType.Decimal).Value = rowData[6].Trim();
        command.Parameters[6].Precision = 20;
        command.Parameters[6].Scale = 7;
        command.Parameters.Add("QtyReceived", SqlDbType.Decimal).Value = rowData[7].Trim();
        command.ExecuteNonQuery();
        command.Parameters[6].Precision = 20;
        command.Parameters[6].Scale = 7;
    }
    bHeaderRow = false;
}
wbs.Close();
conn.Close();
}

不幸的是,这大约需要12分钟。我听说还有其他方法可以从Excel文件本身进行批量导入。关于如何执行此操作的任何指示?

谢谢,
提姆
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,923
地点
英国
编程经验
10+
听起来并不愤世嫉俗,但您不会将数据导入excel,而是直接以您现在想从任何来源提供Excel的方式直接导入数据。

Why is it in Excel format in 的first place?
 

tim8w

知名会员
已加入
2020年9月8日
留言内容
64
编程经验
10+
听起来并不愤世嫉俗,但您不会将数据导入excel,而是直接以您现在想从任何来源提供Excel的方式直接导入数据。

Why is it in Excel format in 的first place?

我无法控制来源。我可以要求使用不同的文件格式,但这几乎是我可以从提供数据的团队那里得到的。目前,我正在通过电子邮件发送一个Excel文件,该文件需要导入到我的SQL Server数据库中。我每十五分钟收到一封电子邮件,这就是为什么我希望有一种更快的方法来完成此任务...
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,923
地点
英国
编程经验
10+
真是糟透了。但是我没有太多建议给您,但也许其他人会给您。

您显然不是第一个遇到此问题的人,这就是为什么为此编写库的原因: 如何在C#或VB.NET中将Excel导入到SQL表中? EasyXLS指南

虽然我与该库没有关系,也没有使用过它,但我建议您开始接触已经可用的库,这些库是为将大量数据导入SQL Server而构建的。

我也建议在Nuget上寻找其他软件包。如果对Linq感到满意,则可以找到Excel到Linq,从Linq到SQL,从正面看,这样做会带来一些好处。

看到 NuGet画廊|与Excel匹配的软件包
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
您是否需要使用存储过程?存储过程是否允许您一次发送多行?
 

tim8w

知名会员
已加入
2020年9月8日
留言内容
64
编程经验
10+
您是否需要使用存储过程?存储过程是否允许您一次发送多行?

不,我可以随便使用。我一直在尝试使用SQLBulkCopy,但是它似乎需要OleDBReader,并且我无法让Provider在我的64位计算机上工作。我将尝试在CSV文件上尝试使用SQLBulkCopy,但这也将导致我不得不编写存储过程,以便可以在本地计算机上将CSV文件的路径传递给它。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,923
地点
英国
编程经验
10+
上面的库声称不需要OleDBReaders:
EasyXLS允许您导入未安装Excel,没有OLEDB,没有Interop或任何其他附加软件的Excel文件。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,923
地点
英国
编程经验
10+

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,923
地点
英国
编程经验
10+
Just because you are on 64bit machine, you need 的32bit drivers.
 
最佳 底部