2017-08-01 69 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