Mik*_*wen 5 c# database sql-server exception
我面临以下问题:
我正在尝试将sql-server中的表与多个外部数据库保持同步.这些外部数据库没有共享的唯一主键,因此本地表具有简单的整数PK.
现在,为了使本地表保持最新,完成以下操作:
现在这个工作正常但对我来说似乎非常低效.大多数情况下,数据已经在本地表中,并导致插入上出现重复的键异常.这意味着需要处理许多异常,这很昂贵.此外,由于PK由DB管理,因此必须使用选择查询来查找要更新的行.
我该如何避免这种影响?我不想使用存储过程,因为我喜欢通过代码保持查询可管理并包含在版本控制中.
我看过合并,但我看到有太多人报告它的问题.
我想我需要使用一种upsert形式,但我不知道如何通过数据库管理PK来实现这一点.
tl; dr:我需要的是一个查询,它允许我插入或更新一行(取决于重复键或不重复),它总是返回行的PK.
我过去做过一个我喜欢的实现。您可能会或可能不会发现它有用。
这就是它的工作原理...我使用适用于两者的模型对象将外部数据和本地数据加载到内存中。例如...
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string PhoneNumber { get; set; }
public string Address { get; set; }
// This comparer will be used to find records that exist or don't exist.
public class KeyFieldComparer : IEqualityComparer<Person>
{
public bool Equals(Person p1, Person p2)
{
return p1.FirstName == p2.FirstName && p1.LastName == p2.LastName;
}
public int GetHashCode(Person p)
{
return p.FirstName.GetHashCode() ^ p.LastName.GetHashCode();
}
}
// This comparer will be used to find records that are outdated and need to be updated.
public class OutdatedComparer : IEqualityComparer<Person>
{
public bool Equals(Person p1, Person p2)
{
return p1.FirstName == p2.FirstName && p1.LastName == p2.LastName && (p1.PhoneNumber != p2.PhoneNumber || p1.Address != p2.Address);
}
public int GetHashCode(Person p)
{
return p.FirstName.GetHashCode() ^ p.LastName.GetHashCode();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我们需要某种方法来唯一地识别我假设您拥有的记录。在这个例子中,它是由FirstNameand LastName(我知道这不是很独特,但为了简单起见,我们假设它运行良好)。IEqualityComparer<>当列表加载到内存中时,它将完成查找过时记录和新记录的工作。
现在我们简单地将现有的过时记录和全新记录分开,如下所示......
List<Person> local = loadLocalRecords();
List<Person> external = loadExternalRecords();
var newRecordsToInsert = external.Except(local, new Person.KeyFieldComparer());
var outdatedRecordsToUpdate = local.Intersect(external, new Person.OutdatedComparer());
Run Code Online (Sandbox Code Playgroud)
我希望这是有道理的。如果你有问题我可以回答。这种方法的好处是它对数据库的点击量最少(我认为)。不好的是它必须将所有内容加载到内存中,这对您来说可能不切实际。但你的桌子尺寸必须很大,这才会成为一个问题。超过几百万条记录取决于列的数量。