【问题标题】:Convert a CSV to System.data.common.dbdatareader for bulk importing CSV into SQL将 CSV 转换为 System.data.common.dbdatareader 以将 CSV 批量导入 SQL
【发布时间】:2017-08-01 19:20:01
【问题描述】:

我正在创建一个简单的 .NET Core 应用程序,它读取 CSV 文件并将行批量插入 SQL Server。我有 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);

提前致谢。

【问题讨论】:

  • “包问题”是什么意思?
  • 我不认为CvsReader类可以和SqlBulkCopy.WriteToServer一起使用。 SqlBulkCopy 需要具有 DataRow 或 DbDataReader。 CvsReader 不是从 DbDataReader 派生的。

标签: c# sql asp.net-core


【解决方案1】:

您正在使用的CSVReader 类没有实现IDataReader。因此它不能与SQLBulkCopy 一起使用。但是nuget LumenWorkCsvReader 上还有另一个CsvReader 可以实现IDataReader p>

用法是这样的。(在下面的小 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

免责声明:我与上述项目无关

【讨论】:

  • 感谢您的评论。但我收到Package LumenWorksCsvReader 3.9.1 is not compatible with netcoreapp1.1。知道该怎么做吗?
  • 对不起,我没有注意您问题中的 asp.net core 标签,仅针对 .NET 4.5 对其进行了测试。您必须找到与 .Net core 兼容的 CSV Parser
【解决方案2】:

尝试将您的 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);
    }
}

【讨论】:

  • 我无法创建 DataTable 对象,因为它需要 netcoreapp1.1 中的参数
  • 'DataTable' does not contain a constructor that takes 0 arguments
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 2014-02-03
  • 1970-01-01
  • 2012-02-09
  • 2013-08-28
相关资源
最近更新 更多