CsvHelper-使用映射写入SQL数据库

Stp*_*111 1 c# csvhelper

到目前为止,CSVHelper .NET库似乎很棒,但是对于像我这样的伪初学者来说,该文档有点缺乏。

我需要读取一个csv文件并将结果写入我们的SQL Server数据库。对于我要写入的表,我需要从CSV列映射到它的列,包括将多个字段串联在一起。

这是我要读取的csv文件的内容:

public static void Main(string[] args)
{
    using (var reader = new StreamReader(@"C:\Users\me\Documents\file.csv"))
    using (var csv = new CsvReader(reader))          
    {
        csv.Configuration.PrepareHeaderForMatch = (string header, int index) =>
            header.Replace(" ", "_").Replace("(", "").Replace(")", "").Replace(".", "");
        var records = csv.GetRecords<EntityCsv>().ToList();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的EntityCsv班级包含csv文件所有列的属性名称。

然后,我还有一个名为的类TaskEntity,其中包含目标数据库表的属性名称和类型(尽管我不清楚是否需要此属性)。

最后,根据同事的建议,我有一种方法可以这样使用SQLBulkCopy

public void AddBulk(List<TaskEntity> entities)
{
    using (var con = GetConnection())
    {
        SqlBulkCopy bulk = new SqlBulkCopy(con);
        bulk.BatchSize = 2000;
        bulk.BulkCopyTimeout = 0;
        bulk.DestinationTableName = "dbo.CsvExports";
        bulk.WriteToServer(entities.AsDataTable());
        bulk.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

我从他那里借了那个代码块,理论上将运行该方法作为最后一步。

但是我知道我之间缺少一个步骤,那就是将字段从csv映射到SQL Server字段。我正在努力实现这一步骤。

因此,为简单起见,我在csv文件中有3列,我想将它们映射到SQL表的2列,如下所示:

CsvColumn1 -> SQLtableColumn1
CsvColumn2 + CsvColumn3 -> SQLtableColumn2
Run Code Online (Sandbox Code Playgroud)

我将如何使用CsvReader和C#完成此任务?我已经浏览了CSVReader文档的“映射”部分,但是我在那里看到的所有内容似乎都是指将列名称从输入文件映射到输出文件中的名称。我在那里(在Google的任何地方)都看不到任何专门用于获取输入文件并将其行导出到SQL数据库的内容。

Dav*_*cht 5

您可以使用ClassMap来将csv列映射到sql表列,并跳过CsvEntity该类。

public static void Main(string[] args)
{
    using (var reader = new StreamReader(@"C:\Users\me\Documents\file.csv"))
    using (var csv = new CsvReader(reader))          
    {
        csv.Configuration.PrepareHeaderForMatch = (string header, int index) =>
            header.Replace(" ", "_").Replace("(", "").Replace(")", "").Replace(".", "");

        csv.Configuration.RegisterClassMap<TaskEntityMap>();

        var records = csv.GetRecords<TaskEntity>().ToList();
    }
}

public class TaskEntity
{
    public int Id { get; set; }
    public string SqlTableColumn1 { get; set; }
    public string SqlTableColumn2 { get; set; }
}

public sealed class TaskEntityMap : ClassMap<TaskEntity>
{
    public TaskEntityMap()
    {
        Map(m => m.SqlTableColumn1).Name("CsvColumn1");
        Map(m => m.SqlTableColumn2).ConvertUsing(row => row.GetField<string>("CsvColumn2") + " " + row.GetField<string>("CsvColumn3"));
    }
}
Run Code Online (Sandbox Code Playgroud)