如何将 CSV 导入到 SqlServer 中 ?
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将 CSV 导入到 SqlServer 中 ?相关的知识,希望对你有一定的参考价值。
咨询区
user3083221
请问在 C# 中是否有好的方式实现将一个大的 csv
导入到 SQL Server 中,这个 csv 文件包含大概 30000
行,25
列。
回答区
Kirk
其实你不需要通过编程的方式,完全可以用 SQL Server 管理器界面
直接将 CSV 导入到 SQL Server 中,如果你真的想要编程实现的话,也不是没有办法,大概步骤如下:
将 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 将 DataTable 插入到 Table 中
对于 Sql Server 的批量插入,绝对首选 SqlBulkCopy
,参考如下代码:
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);
Cinchoo
有一个开源工具包:ChoETL (https://www.nuget.org/packages/ChoETL/) 也可以实现通过编程的方式实现批量导入,它是一种流式操作,只需要很少甚至不需要内存,参考如下代码:
string connectionstring = @"#YOUR DB ConnectionString#";
using (SqlBulkCopy bcp = new SqlBulkCopy(connectionstring))
using (var p = new ChoCSVReader("#YOUR CSV FILE#").WithFirstLineHeader())
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());
点评区
在现实开发中,这种需求还是蛮常见的,学习了。
以上是关于如何将 CSV 导入到 SqlServer 中 ?的主要内容,如果未能解决你的问题,请参考以下文章
将sqlserver导出的csv数据导入到ubuntu和mac上的mysql
将超过 255 个字符从 excel 导入到 sql server(上一个问题 - 如何使用 ssis 将文本限定 CSV 动态加载到 sql server)