2

我正在创建一个可以将 .csv 文件导入 SQL 数据库的应用程序。.csv 文件被读入 7 列:Id、InvoiceAmount、InvoiceDate、InvoiceNumber、DeniedDate、DeniedReasonId 和 DeniedNotes。.csv 中的每一行都有一个 Id,但接下来的六个字段中只有三个会被填充。InvoiceAmount, InvoiceDate, InvoiceNumberDeniedDate, 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);

任何帮助,将不胜感激。谢谢!

4

1 回答 1

0

如果您希望将 CSV 文件中的空值转换为null您必须将属性更改为Nullable类型(DateTime?decimal?int?)。您当前看到 1/1/0001 12:00 AM 和 0 的原因是因为这些是 和 的默认DateTimeint。通过将它们更改为Nullable类型,默认值将更改为null(或者更准确地说是 a Nullable<T>where HasValueis false,但 C# 基本上会将其视为 a 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,如果它们还没有的话。

于 2015-07-29T12:17:59.123 回答