将CSV导入SQL-Server – 性能

我创建了一个小项目,允许用户通过Entity-Framework将CSV文件导入SQL。 主要程序如下:

using (TextFieldParser tx = new TextFieldParser(file, Encoding.UTF8)) { tx.TextFieldType = FieldType.Delimited; tx.SetDelimiters(";"); tx.ReadLine(); //The First Line are the headers, no need while (!tx.EndOfData) { decimal decTmp; int intTmp; string[] fields = tx.ReadFields(); //Convert every field to the appropriate type, tryparse if nullable ReportInfo("Verarbeite Nummer: " + fields[(int)ConnectionEvaluationFileField.PhoneNumber].Trim()); Verbindunganalyse con = new Verbindunganalyse(); con.Auswertungszeitraum = fields[(int)ConnectionEvaluationFileField.EvaluationTimeSpan].TrimStart('0'); con.Betrag_inkl_MWST_CHF = Decimal.Parse(fields[(int)ConnectionEvaluationFileField.Cost]); if (decimal.TryParse(fields[(int)ConnectionEvaluationFileField.DataInMb], out decTmp)) con.Daten_MB = decTmp; con.Durchwahlnummer = Int64.Parse(fields[(int)ConnectionEvaluationFileField.PhoneNumber]); con.Produkteigenschaft = fields[(int)ConnectionEvaluationFileField.ProductProperty]; if (Int32.TryParse(fields[(int)ConnectionEvaluationFileField.Messages], out intTmp)) con.SMS_MMS_Anzahl = intTmp; con.TelefonieDauer = TimeSpan.Parse(fields[(int)ConnectionEvaluationFileField.CallLength]); con.Untergruppe = fields[(int)ConnectionEvaluationFileField.SubGroup]; if (Int32.TryParse(fields[(int)ConnectionEvaluationFileField.Connections], out intTmp)) con.Verbindungen_Anzahl = intTmp; container.Verbindunganalyse.Add(con); } } 

它是德语,但我认为代码非常明确:我使用TextFieldParser读取数据,创建一个新的Entitiy并解析/检查属性中的字段。

问题:客户曾经有一个Access-Solution,需要20-30秒来导入数据,我的解决方案,我需要2-3分钟2个文件和5k数据集。

我找到了一些像https://efbulkinsert.codeplex.com/这样的BulkInsert,但我们在这里讲的是两个文件中的10k数据集。

我删除了ReportInfo等,但我看不到让这项工作更快的方法。 您是否认为使用EF可以更快地制作此类内容? 或者TextFieldParser非常慢,我需要检查那里?

我知道这是一个老post,但我一直在试验这个。 我尝试了Entity Framework Seeder NuGet包和一个带有以下代码的裸机SQL批量插入 ;

 CREATE TABLE [dbo].[TempTable] ( [Field] type constraints, etc... ) GO BULK INSERT TempTable FROM 'filePath' WITH ( FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR = '\r\n' ) GO INSERT INTO [FinalTable] SELECT [Fields] FROM [TempTable] GO DROP TABLE [TempTable] 

播种器方法在67秒内插入10,000条记录,批量插入方法需要223毫秒。 真的很简单。