使用标识行将 CSV 写入数据表
Writing CSV To Datatable With identity Row
我有一个 SQL 服务器数据库 table 以下设计:
[Id] INT IDENTITY (1, 1) NOT NULL,
[State] NVARCHAR (MAX) NOT NULL,
[Abbreviation] NVARCHAR (MAX) NOT NULL,
CONSTRAINT [PK_USStates] PRIMARY KEY CLUSTERED ([Id] ASC)
我有一个 .csv 文件,格式如下:
Alabama, AL
Alaska, AK
注意:.csv 文件中没有 ID 字段。
当我尝试将 .csv 文件导入我的 SQL 服务器数据库时,我收到一个错误,因为它试图将 "Alabama"(.csv 的字段 1)写入 Id 字段(数据库中的字段 1 table)。
如何告诉 CSVHelper 数据库中的字段 1 是身份字段,并忽略它,从而将 "Alabama" 写入字段 2,将 "AL" 写入字段 3?
在此先感谢您的帮助。
附录:
我正在使用 Web 表单导入。这里也可能有错误,因为这是我第一次尝试编写这样的代码...
public async Task<IActionResult> OnPostAsync()
{
using (var reader = new StreamReader(@"\SomeComputer\SomePath\states.csv"))
using (var csv = new CsvReader(reader))
{
csv.Configuration.HasHeaderRecord = false;
IEnumerable<USStates> records = csv.GetRecords<USStates>();
foreach (var record in records)
{
_context.USStates.Add(record);
await _context.SaveChangesAsync();
}
}
return RedirectToPage("./Index");
}
Note: Sample states.csv data:
"Alaska","AK"
"American Samoa","AS"
"Arizona","AZ"
"Arkansas","AR"
"California","CA"
"Colorado","CO"
"Connecticut","CT"
"Delaware","DE"
"District Of Columbia","DC"
"Florida","FL"
"Georgia","GA"
"Guam","GU"
"Hawaii","HI"
"Idaho","ID"
"Illinois","IL"
"Indiana","IN"
您可以使用 ClassMap
来指示要查找的列以及查找位置。
public async Task<IActionResult> OnPostAsync()
{
using (var reader = new StreamReader(@"\SomeComputer\SomePath\states.csv"))
using (var csv = new CsvReader(reader))
{
csv.Configuration.HasHeaderRecord = false;
csv.Configuration.RegisterClassMap<USStatesMap>();
IEnumerable<USStates> records = csv.GetRecords<USStates>();
foreach (var record in records)
{
_context.USStates.Add(record);
await _context.SaveChangesAsync();
}
}
}
public class USStates
{
public int Id { get; set; }
public string State { get; set; }
public string Abbreviation { get; set; }
}
public class USStatesMap : ClassMap<USStates>
{
public USStatesMap()
{
Map(m => m.State).Index(0);
Map(m => m.Abbreviation).Index(1);
}
}
我有一个 SQL 服务器数据库 table 以下设计:
[Id] INT IDENTITY (1, 1) NOT NULL,
[State] NVARCHAR (MAX) NOT NULL,
[Abbreviation] NVARCHAR (MAX) NOT NULL,
CONSTRAINT [PK_USStates] PRIMARY KEY CLUSTERED ([Id] ASC)
我有一个 .csv 文件,格式如下:
Alabama, AL
Alaska, AK
注意:.csv 文件中没有 ID 字段。
当我尝试将 .csv 文件导入我的 SQL 服务器数据库时,我收到一个错误,因为它试图将 "Alabama"(.csv 的字段 1)写入 Id 字段(数据库中的字段 1 table)。
如何告诉 CSVHelper 数据库中的字段 1 是身份字段,并忽略它,从而将 "Alabama" 写入字段 2,将 "AL" 写入字段 3?
在此先感谢您的帮助。
附录: 我正在使用 Web 表单导入。这里也可能有错误,因为这是我第一次尝试编写这样的代码...
public async Task<IActionResult> OnPostAsync()
{
using (var reader = new StreamReader(@"\SomeComputer\SomePath\states.csv"))
using (var csv = new CsvReader(reader))
{
csv.Configuration.HasHeaderRecord = false;
IEnumerable<USStates> records = csv.GetRecords<USStates>();
foreach (var record in records)
{
_context.USStates.Add(record);
await _context.SaveChangesAsync();
}
}
return RedirectToPage("./Index");
}
Note: Sample states.csv data:
"Alaska","AK"
"American Samoa","AS"
"Arizona","AZ"
"Arkansas","AR"
"California","CA"
"Colorado","CO"
"Connecticut","CT"
"Delaware","DE"
"District Of Columbia","DC"
"Florida","FL"
"Georgia","GA"
"Guam","GU"
"Hawaii","HI"
"Idaho","ID"
"Illinois","IL"
"Indiana","IN"
您可以使用 ClassMap
来指示要查找的列以及查找位置。
public async Task<IActionResult> OnPostAsync()
{
using (var reader = new StreamReader(@"\SomeComputer\SomePath\states.csv"))
using (var csv = new CsvReader(reader))
{
csv.Configuration.HasHeaderRecord = false;
csv.Configuration.RegisterClassMap<USStatesMap>();
IEnumerable<USStates> records = csv.GetRecords<USStates>();
foreach (var record in records)
{
_context.USStates.Add(record);
await _context.SaveChangesAsync();
}
}
}
public class USStates
{
public int Id { get; set; }
public string State { get; set; }
public string Abbreviation { get; set; }
}
public class USStatesMap : ClassMap<USStates>
{
public USStatesMap()
{
Map(m => m.State).Index(0);
Map(m => m.Abbreviation).Index(1);
}
}