我正在创建一个简单的.NET Core应用程序,它读取CSV文件并批量将行插入SQL服务器。我有56列,所以,我不想创建一个实体类。我看了很多例子,他们使用SqlBulkCopy,但由于包问题,它们都不适用于我。
在没有对代码中的列名进行硬编码的情况下,是否可以帮助我将CSV导入SQL?我的CSV与db表结构完全同步。
CSVHelper.CsvReader rdr = new CSVHelper.CsvReader(new StreamReader(new FileStream(@"/Users/selva/Downloads/test.csv", FileMode.Open)));
System.Data.SqlClient.SqlBulkCopy bcp = new SqlBulkCopy(builder.ConnectionString, SqlBulkCopyOptions.UseInternalTransaction);
bcp.BatchSize = 500;
bcp.DestinationTableName = "test_table";
bcp.NotifyAfter = 500;
bcp.SqlRowsCopied += (sender, e) =>
{
Console.WriteLine("Written: " + e.RowsCopied.ToString());
};
bcp.WriteToServer(rdr);
提前致谢。
答案 0 :(得分:1)
CSVReader
类未实现IDataReader
。因此它无法与SQLBulkCopy
一起使用。但是,nuget LumenWorkCsvReader 上还有另一个CsvReader可用实现IDataReader
用法就是这样的。(在一个小的CSV文件的代码下测试)
using (var bcp = new SqlBulkCopy("connectionString", SqlBulkCopyOptions.UseInternalTransaction))
using (var rdr = new CsvReader(new StreamReader("data.csv"), false))
{
bcp.BatchSize = 500;
bcp.DestinationTableName = "test_table";
bcp.NotifyAfter = 500;
bcp.SqlRowsCopied += (sender, e) =>
{
Console.WriteLine("Written: " + e.RowsCopied.ToString());
};
bcp.WriteToServer(rdr);
}
你必须在顶部使用
添加以下内容using LumenWorks.Framework.IO.Csv;
免责声明:我与上述项目没有任何关系
答案 1 :(得分:-1)
尝试将CSV转换为DataTable
然后照常批量复制。
using (var reader = File.OpenText(@""))
using (var csv = new CsvReader(reader))
using (var tbl = new DataTable())
{
while (csv.Read())
{
var row = tbl.NewRow();
foreach(DataColumn col in tbl.Columns)
row[col.ColumnName] = csv.GetField(col.DataType, col.ColumnName);
tbl.Rows.Add(row);
}
using (var bcp = new SqlBulkCopy("my_conn", SqlBulkCopyOptions.UseInternalTransaction))
{
bcp.WriteToServer(tbl);
}
}