将CSV文件上传到SQL Server

使用C#将大型csv数据文件上传到SQL服务器的最佳方法是什么? 该文件包含大约30,000行和25列。

第一关,你不需要编程。 您可以使用SQL管理工具直接将CSV文件上载到SQL数据库中。 但是,如果您确实需要通过编程来完成,请阅读以下内容。

就个人而言,我认为这种方法是通过编程实现的最有效和最简单的方法。

通常,您可以分两步完成

第一步是读取CSV文件并将记录保存为DataTable
第二步是将检索到的DataTable作为批量条目存储到SQL数据库表中

这是一个将CSV文件数据作为DataTable返回的函数。 调用并将其保存在内存中,您可以随心所欲地执行任何操作。

此function将CSV读取文件返回到DataTable。

 private static DataTable GetDataTabletFromCSVFile(string csv_file_path) { DataTable csvData = new DataTable(); try { using(TextFieldParser csvReader = new TextFieldParser(csv_file_path)) { csvReader.SetDelimiters(new string[] { "," }); csvReader.HasFieldsEnclosedInQuotes = true; string[] colFields = csvReader.ReadFields(); foreach (string column in colFields) { DataColumn datecolumn = new DataColumn(column); datecolumn.AllowDBNull = true; csvData.Columns.Add(datecolumn); } while (!csvReader.EndOfData) { string[] fieldData = csvReader.ReadFields(); //Making empty value as null for (int i = 0; i < fieldData.Length; i++) { if (fieldData[i] == "") { fieldData[i] = null; } } csvData.Rows.Add(fieldData); } } } catch (Exception ex) { return null; } return csvData; } } 

SQLBulkCopy - 使用此函数将Retrieved DataTable插入Sql表

 static void InsertDataIntoSQLServerUsingSQLBulkCopy(DataTable csvFileData) { using(SqlConnection dbConnection = new SqlConnection("Data Source=ProductHost;Initial Catalog=yourDB;Integrated Security=SSPI;")) { dbConnection.Open(); using (SqlBulkCopy s = new SqlBulkCopy(dbConnection)) { s.DestinationTableName = "Your table name"; foreach (var column in csvFileData.Columns) s.ColumnMappings.Add(column.ToString(), column.ToString()); s.WriteToServer(csvFileData); } } 

资源

使用System.Data.SqlClient.SqlBulkCopy类将数据插入到Sql表中。 要使用该类,您还需要将CVS数据转换为DataTable,请参阅此处的方法之一。

这听起来像SSIS的完美工作。 它是SQL Server的免费部分,可以遍历文件夹中的所有csv文件,速度非常快,并且具有出色的error handling和日志记录function。

此技术使用SQLBulkCopy()工具,但不会将整个文件读入内存。

诀窍是它实现了一个IDataReader类来读取.csv文件。

https://www.codeproject.com/Tips/1029831/Fast-and-Simple-IDataReader-Implementation-to-Read

这是通过编程将CSV上传到数据库的另一种方法。 Cinchoo ETL是一个开源库,可以使用DataReader将CSV文件上传到数据库,这是一种几乎没有内存开销的流式方法。

以下是如何操作的示例

 string connectionstring = @"#YOUR DB ConnectionString#"; using (SqlBulkCopy bcp = new SqlBulkCopy(connectionstring)) { using (var p = new ChoCSVReader("#YOUR CSV FILE#")) { bcp.DestinationTableName = "#TABLENAME#"; bcp.EnableStreaming = true; bcp.BatchSize = 10000; bcp.BulkCopyTimeout = 0; bcp.NotifyAfter = 100; bcp.SqlRowsCopied += delegate (object sender, SqlRowsCopiedEventArgs e) { Console.WriteLine(e.RowsCopied.ToString("#,##0") + " rows copied."); }; bcp.WriteToServer(p.AsDataReader()); } }