2017-08-01 70 views
0

我正在创建一个简单的.NET Core应用程序,该应用程序读取CSV文件,并将这些行插入到SQL Server中。我有56列,所以,我不想创建一个实体类。我看到了很多示例,他们使用SqlBulkCopy,但由于包问题,他们都没有为我工作。将CSV转换为System.data.common.dbdatareader以将CSV大容量导入SQL

任何人都可以帮助我将CSV导入到SQL中,而无需在代码中对列名进行硬编码吗?我的CSV与数据库表结构完全同步。

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); 

在此先感谢。

+1

提到的项目没有联系你所说的 “包问题” 是指什么? –

+0

我不认为CvsReader类可以与SqlBulkCopy.WriteToServer一起使用。 SqlBulkCopy需要有DataRow的或DbDataReader。 CvsReader不是从DbDataReader派生的。 –

回答

0

尝试将您的CSV转换为DataTable,然后像往常一样批量复制。您正在使用不实现IDataReader。所以它不能与SQLBulkCopy使用

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); 
    } 
} 
+0

我无法创建DataTable对象,因为它期望'netcoreapp1.1'中的参数 – Selva

+0

''DataTable'不包含带0参数的构造函数' – Selva

1

CSVReader类。不过有上的NuGet LumenWorkCsvReader它实现IDataReader

用法是财产以后这样可在另一个CsvReader。 (测试下面的代码为一个小的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

免责声明:我有一个以上

+0

感谢您的评论。但是我得到'Package LumenWorksCsvReader 3.9.1与netcoreapp1.1'不兼容。任何想法该怎么办? – Selva

+0

对不起,我没有关注你的问题中的asp.net核心标记,只针对.NET 4.5进行了测试。你将不得不找到一个兼容.Net核心的CSV解析器 – ClearLogic