将CSV转换为System.data.common.dbdatareader,以便将CSV批量导入SQL

时间:2017-08-01 19:20:01

标签: c# sql asp.net-core

我正在创建一个简单的.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);

提前致谢。

2 个答案:

答案 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;

GitHub Page

免责声明:我与上述项目没有任何关系

答案 1 :(得分:-1)

尝试将CS​​V转换为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);
    }
}