没有从类中获取所有字段以使用SQLBulkTools插入数据库

时间:2019-02-19 22:19:56

标签: c# sql sqlbulkcopy

我正在使用C#软件包https://github.com/tiagorosendo/SqlBulkTools

我有一个对象列表,其中包含要批量插入数据库的数据。

这是我的对象:

using System;
using System.ComponentModel.DataAnnotations.Schema;
using System.Xml.Serialization;

namespace CFDE.Model
{
    [XmlRoot(ElementName = "OwnershipPeriod")]
    public class OwnershipPeriod : ChathamBase
    {
        [XmlElement(ElementName = "OwnershipPercentage")]
        [Column(TypeName = "decimal")]
        public Nullable<decimal> OwnershipPercentage;


        [XmlElement(ElementName = "OwnershipPercentageEffectiveDate")]
        [Column(TypeName = "datetime")]
        public Nullable<DateTime> OwnershipPercentageEffectiveDate;

        [XmlElement(ElementName = "OwnershipStructure")]
        [Column(TypeName = "varchar")]
        public string OwnershipStructure;
    }
}

这是基类(没什么花哨的)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CFDE.Model
{
    interface IChathamBase
    {
        int TransactionIdentifier { get; set; }
    }


    public class ChathamBase : IChathamBase
    {
        public int TransactionIdentifier { get; set; }
    }
}

下面是我用来向数据库中插入数据的代码。

internal static void BulkUpsert(string connectionName, List<OwnershipPeriod> op)
        {
           BulkOperations bulk = new BulkOperations();

            using (TransactionScope trans = new TransactionScope())
            {
                using (SqlConnection cn = GetConnection(connectionName))
                {
                    bulk.Setup<OwnershipPeriod>()
                        .ForCollection(op)
                        .WithTable("OwnershipPeriod")
                        .AddAllColumns()
                        //.AddColumn(x => x.TransactionIdentifier)
                        //.AddColumn(x => x.OwnershipPercentage)
                        .BulkInsertOrUpdate()
                        //.SetIdentityColumn(x => x.TransactionIdentifier)
                        .MatchTargetOn(x => x.TransactionIdentifier)
                        .Commit(cn);
                }

                trans.Complete();
            }
        }

我的问题是数据库中的表有4列。一个来自基类,另一个来自基类。唯一插入/更新的列是第一列(来自基类)。

我正在将相同的代码用于另一个类,该类也继承自相同的基类,并且工作正常。

我确定的唯一一件事是,此类中的字段都具有Nullable数据类型,但是我不知道该如何解决。我需要那些标记为可空的字段,因为我要从中提取数据的XML具有可空的字段。

在反序列化期间是否还有另一种从XML中提取它们的方法?

还有另一种方法来识别它们以检索它们以插入到数据库吗?

正在寻找可以指引我正确方向的事物。...

有效的类

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml.Serialization;

    namespace CFDE.Model 
    {
        [XmlRoot(ElementName = "LoanIdentifiers")]
        public class LoanIdentifiers
        {
            [XmlElement(ElementName = "TransactionIdentifier")]
            public int TransactionIdentifier { get; set; }

            [XmlElement(ElementName = "TransactionQuoteIdentifier")]
            public int TransactionQuoteIdentifier { get; set; }

            [XmlElement(ElementName = "DebtIdentifier")]
            public string DebtIdentifier { get; set; }

            [XmlElement(ElementName = "DebtDescription")]
            public string DebtDescription { get; set; }

            [XmlElement(ElementName = "CorporateId")]
            public string CorporateId { get; set; }

            [XmlElement(ElementName = "ReferenceNumberInternal")]
            public string ReferenceNumberInternal { get; set; }

            [XmlElement(ElementName = "ReferenceNumberLender")]
            public string ReferenceNumberLender { get; set; }

            [XmlElement(ElementName = "ReferenceNumberLoan")]
            public string ReferenceNumberLoan { get; set; }

            [XmlElement(ElementName = "ReferenceNumberChatham")]
            public string ReferenceNumberChatham { get; set; }

            [XmlElement(ElementName = "Hypo")]
            public string Hypo { get; set; }

            [XmlElement(ElementName = "TransactionCreateDate")]
            public DateTime TransactionCreateDate { get; set; }

            [XmlElement(ElementName = "ScheduleLastModifiedDate")]
            public DateTime ScheduleLastModifiedDate { get; set; }
        }
    }




internal static void BulkUpsert(string connectionName, IEnumerable<LoanIdentifiers> li)
    {
        BulkOperations bulk = new BulkOperations();

        using (TransactionScope trans = new TransactionScope())
        {
            using (SqlConnection cn = GetConnection(connectionName))
            {
                bulk.Setup<LoanIdentifiers>()
                    .ForCollection(li)
                    .WithTable("LoanIdentifiers")
                    .AddAllColumns()
                    .BulkInsertOrUpdate()
                    //.SetIdentityColumn(x => x.TransactionIdentifier)
                    .MatchTargetOn(x => x.TransactionIdentifier)
                    .Commit(cn);
            }

            trans.Complete();
        }

    }

1 个答案:

答案 0 :(得分:0)

正如您自己发现的那样,SqlBulkTools only loops through the type's properties,因此所有字段都将被忽略。正常的编码标准是将所有字段设为私有,并使用方法、属性或索引器来公开私有字段(Reference),这就是为什么它们只检查属性的原因。