将 .CSV 导入 SQL 数据库时,将空字段设置为 null,而不是默认值
Set empty fields to null, rather than defaults when importing .CSV to SQL database
我正在创建一个可以将 .csv 文件导入 SQL 数据库的应用程序。 .csv 文件被读入 7 列:Id、InvoiceAmount、InvoiceDate、InvoiceNumber、DeniedDate、DeniedReasonId 和 DeniedNotes。 .csv 中的每一行都有一个 ID,但接下来的六个字段中只会填充三个。 InvoiceAmount、InvoiceDate、InvoiceNumber 或 DeniedDate、DeniedReasonId、DeniedNotes。
[Table("TemporaryCsvUpload")]
public class OutstandingCredit
{
[CsvColumn(FieldIndex = 1, CanBeNull = false)]
public string Id { get; set; }
[CsvColumn(FieldIndex = 2, OutputFormat = "dd MMM HH:mm:ss")]
public DateTime InvoiceDate { get; set; }
[CsvColumn(FieldIndex = 3)]
public string InvoiceNumber { get; set; }
[CsvColumn(FieldIndex = 4, OutputFormat = "C")]
public decimal InvoiceAmount { get; set; }
[CsvColumn(FieldIndex = 5, OutputFormat = "dd MMM HH:mm:ss")]
public DateTime DeniedDate { get; set; }
[CsvColumn(FieldIndex = 6)]
public int DeniedReasonId { get; set; }
[CsvColumn(FieldIndex = 7)]
public string DeniedNotes { get; set; }
}
问题来了:在 .csv 的每一行中,InvoiceDate 或 DeniedDate 都为空。发生这种情况时,我希望数据库中的相应字段保持为空。但是,它默认为 1/1/0001 12:00。此外,当 .csv 中的 DeniedReasonId 为空时,它默认为 0。我试图保留该空值而不是默认值。
这是我使用 LinqToCsv 以 .csv 形式循环值的地方:
var cc = new CsvContext();
var filePath = uploadFile(csvFile.InputStream);
var model = cc.Read<OutstandingCredit>(filePath, inputFileDescription);
try
{
var entity = new ManagementEntities();
foreach (var item in model)
{
var tc = new TemporaryCsvUpload
{
Id = item.Id,
InvoiceAmount = item.InvoiceAmount,
InvoiceDate = item.InvoiceDate,
InvoiceNumber = item.InvoiceNumber,
DeniedDate = item.DeniedDate,
DeniedReasonId = item.DeniedReasonId,
DeniedNotes = item.DeniedNotes
};
entity.TemporaryCsvUploads.Add(tc);
如有任何帮助,我们将不胜感激。谢谢!
如果您希望 CSV 文件中的空值转换为 null
,您必须将属性更改为 Nullable
类型(DateTime?
、decimal?
和 int?
).您当前看到 1/1/0001 12:00 AM 和 0 的原因是因为它们是 DateTime
和 int
的默认值。通过将它们更改为 Nullable
类型,默认值将更改为 null
(或者更准确地说,更改为 Nullable<T>
其中 HasValue
为假,但 C# 基本上会将其视为 null
).
[Table("TemporaryCsvUpload")]
public class OutstandingCredit
{
[CsvColumn(FieldIndex = 1, CanBeNull = false)]
public string Id { get; set; }
[CsvColumn(FieldIndex = 2, OutputFormat = "dd MMM HH:mm:ss")]
public DateTime? InvoiceDate { get; set; }
[CsvColumn(FieldIndex = 3)]
public string InvoiceNumber { get; set; }
[CsvColumn(FieldIndex = 4, OutputFormat = "C")]
public decimal? InvoiceAmount { get; set; }
[CsvColumn(FieldIndex = 5, OutputFormat = "dd MMM HH:mm:ss")]
public DateTime? DeniedDate { get; set; }
[CsvColumn(FieldIndex = 6)]
public int? DeniedReasonId { get; set; }
[CsvColumn(FieldIndex = 7)]
public string DeniedNotes { get; set; }
}
您还必须确保 TemporaryCsvUpload
中的相应类型也是 Nullable
,如果它们还没有的话。
我正在创建一个可以将 .csv 文件导入 SQL 数据库的应用程序。 .csv 文件被读入 7 列:Id、InvoiceAmount、InvoiceDate、InvoiceNumber、DeniedDate、DeniedReasonId 和 DeniedNotes。 .csv 中的每一行都有一个 ID,但接下来的六个字段中只会填充三个。 InvoiceAmount、InvoiceDate、InvoiceNumber 或 DeniedDate、DeniedReasonId、DeniedNotes。
[Table("TemporaryCsvUpload")]
public class OutstandingCredit
{
[CsvColumn(FieldIndex = 1, CanBeNull = false)]
public string Id { get; set; }
[CsvColumn(FieldIndex = 2, OutputFormat = "dd MMM HH:mm:ss")]
public DateTime InvoiceDate { get; set; }
[CsvColumn(FieldIndex = 3)]
public string InvoiceNumber { get; set; }
[CsvColumn(FieldIndex = 4, OutputFormat = "C")]
public decimal InvoiceAmount { get; set; }
[CsvColumn(FieldIndex = 5, OutputFormat = "dd MMM HH:mm:ss")]
public DateTime DeniedDate { get; set; }
[CsvColumn(FieldIndex = 6)]
public int DeniedReasonId { get; set; }
[CsvColumn(FieldIndex = 7)]
public string DeniedNotes { get; set; }
}
问题来了:在 .csv 的每一行中,InvoiceDate 或 DeniedDate 都为空。发生这种情况时,我希望数据库中的相应字段保持为空。但是,它默认为 1/1/0001 12:00。此外,当 .csv 中的 DeniedReasonId 为空时,它默认为 0。我试图保留该空值而不是默认值。
这是我使用 LinqToCsv 以 .csv 形式循环值的地方:
var cc = new CsvContext();
var filePath = uploadFile(csvFile.InputStream);
var model = cc.Read<OutstandingCredit>(filePath, inputFileDescription);
try
{
var entity = new ManagementEntities();
foreach (var item in model)
{
var tc = new TemporaryCsvUpload
{
Id = item.Id,
InvoiceAmount = item.InvoiceAmount,
InvoiceDate = item.InvoiceDate,
InvoiceNumber = item.InvoiceNumber,
DeniedDate = item.DeniedDate,
DeniedReasonId = item.DeniedReasonId,
DeniedNotes = item.DeniedNotes
};
entity.TemporaryCsvUploads.Add(tc);
如有任何帮助,我们将不胜感激。谢谢!
如果您希望 CSV 文件中的空值转换为 null
,您必须将属性更改为 Nullable
类型(DateTime?
、decimal?
和 int?
).您当前看到 1/1/0001 12:00 AM 和 0 的原因是因为它们是 DateTime
和 int
的默认值。通过将它们更改为 Nullable
类型,默认值将更改为 null
(或者更准确地说,更改为 Nullable<T>
其中 HasValue
为假,但 C# 基本上会将其视为 null
).
[Table("TemporaryCsvUpload")]
public class OutstandingCredit
{
[CsvColumn(FieldIndex = 1, CanBeNull = false)]
public string Id { get; set; }
[CsvColumn(FieldIndex = 2, OutputFormat = "dd MMM HH:mm:ss")]
public DateTime? InvoiceDate { get; set; }
[CsvColumn(FieldIndex = 3)]
public string InvoiceNumber { get; set; }
[CsvColumn(FieldIndex = 4, OutputFormat = "C")]
public decimal? InvoiceAmount { get; set; }
[CsvColumn(FieldIndex = 5, OutputFormat = "dd MMM HH:mm:ss")]
public DateTime? DeniedDate { get; set; }
[CsvColumn(FieldIndex = 6)]
public int? DeniedReasonId { get; set; }
[CsvColumn(FieldIndex = 7)]
public string DeniedNotes { get; set; }
}
您还必须确保 TemporaryCsvUpload
中的相应类型也是 Nullable
,如果它们还没有的话。