我正在使用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();
}
}
答案 0 :(得分:0)
正如您自己发现的那样,SqlBulkTools only loops through the type's properties,因此所有字段都将被忽略。正常的编码标准是将所有字段设为私有,并使用方法、属性或索引器来公开私有字段(Reference),这就是为什么它们只检查属性的原因。