比较特定列时防止重复插入 SQL db,必须使用 PetaPoco
Preventing duplicate inserts into SQL db when comparing a specific column, must use PetaPoco
背景资料
我目前正在开发一个电子邮件爬虫程序,它将在我爬取的电子邮件数据库中进行记录以获取信息。目前,我的公司限制我使用 Petapoco 来解决代码维护问题。我目前遇到的问题 运行 是重复的记录被记录到数据库中。我一直在寻找可以给我提示如何实现这一目标的示例或文档,但我一直找不到。
问题
目前我可以毫无问题地将记录插入数据库,但它也会插入重复项。
附加信息
我要确保唯一的列是 [AppointmentUniqueId],我有一个主键 Id,我的 table 是 AppointmentActivities,我要插入的是 class 一条记录的模型。
当前代码
public static async Task<bool> InsertActivitiesData(List<Act_Appointments> recordList)
{
int recordsInserted = 0;
try
{
using (PetaPoco.Database databaseInstance = new PetaPoco.Database("PMconString"))
{
foreach (var record in recordList)
{
databaseInstance.Insert("AppointmentActivities", "Id", record);
recordsInserted++;
}
}
log4net.LogManager.GetLogger("AppInfoLogger").Info("[ ServiceRan : Insert Email Data To DB ]" + "[ Records Inserted: " + recordsInserted.ToString() + " ]");
return true;
}
catch (Exception ex)
{
log4net.LogManager.GetLogger("AppErrorLogger").Error("[ReconcileEvents]" + JsonConvert.SerializeObject(ex));
log4net.LogManager.GetLogger("EmailLogger").Error("[ReconcileEvents]" + JsonConvert.SerializeObject(ex));
return false;
}
}
好吧,我用最实用的方法来解决这个问题。我不确定它是否是最有效的,但由于时间限制,我真的不能在这个问题上停留太久。我继续 运行 对 AppointmentUniqueId 的单个查询,如果它返回 null,则表示该项目不存在。
public static async Task<bool> InsertActivitiesData(List<Act_Appointments> recordList)
{
int recordsInserted = 0;
int duplicates = 0;
try
{
using (PetaPoco.Database databaseInstance = new PetaPoco.Database("PMconString"))
{
foreach (var record in recordList)
{
if (databaseInstance.FirstOrDefault<Act_Appointments>("SELECT * FROM AppointmentActivities WHERE AppointmentUniqueId =@0", record.AppointmentUniqueId) == null)
{
databaseInstance.Insert("AppointmentActivities", "Id", record);
recordsInserted++;
}
else
{
duplicates++;
}
}
}
log4net.LogManager.GetLogger("AppInfoLogger").Info("[Insert Appointment Data To DB]" + "[ Records Inserted: " + recordsInserted.ToString() + " ]"+ "[ Duplicates Not Inserted: " + duplicates.ToString() + " ]");
return true;
}
catch (Exception ex)
{
log4net.LogManager.GetLogger("AppErrorLogger").Error("[ReconcileEvents]" + JsonConvert.SerializeObject(ex));
log4net.LogManager.GetLogger("EmailLogger").Error("[ReconcileEvents]" + JsonConvert.SerializeObject(ex));
return false;
}
}
PS.
我会将此开放 10 天,以听取社区的反馈,并查看是否有不同的方法来解决我正在尝试做的事情。
背景资料
我目前正在开发一个电子邮件爬虫程序,它将在我爬取的电子邮件数据库中进行记录以获取信息。目前,我的公司限制我使用 Petapoco 来解决代码维护问题。我目前遇到的问题 运行 是重复的记录被记录到数据库中。我一直在寻找可以给我提示如何实现这一目标的示例或文档,但我一直找不到。
问题
目前我可以毫无问题地将记录插入数据库,但它也会插入重复项。
附加信息
我要确保唯一的列是 [AppointmentUniqueId],我有一个主键 Id,我的 table 是 AppointmentActivities,我要插入的是 class 一条记录的模型。
当前代码
public static async Task<bool> InsertActivitiesData(List<Act_Appointments> recordList)
{
int recordsInserted = 0;
try
{
using (PetaPoco.Database databaseInstance = new PetaPoco.Database("PMconString"))
{
foreach (var record in recordList)
{
databaseInstance.Insert("AppointmentActivities", "Id", record);
recordsInserted++;
}
}
log4net.LogManager.GetLogger("AppInfoLogger").Info("[ ServiceRan : Insert Email Data To DB ]" + "[ Records Inserted: " + recordsInserted.ToString() + " ]");
return true;
}
catch (Exception ex)
{
log4net.LogManager.GetLogger("AppErrorLogger").Error("[ReconcileEvents]" + JsonConvert.SerializeObject(ex));
log4net.LogManager.GetLogger("EmailLogger").Error("[ReconcileEvents]" + JsonConvert.SerializeObject(ex));
return false;
}
}
好吧,我用最实用的方法来解决这个问题。我不确定它是否是最有效的,但由于时间限制,我真的不能在这个问题上停留太久。我继续 运行 对 AppointmentUniqueId 的单个查询,如果它返回 null,则表示该项目不存在。
public static async Task<bool> InsertActivitiesData(List<Act_Appointments> recordList)
{
int recordsInserted = 0;
int duplicates = 0;
try
{
using (PetaPoco.Database databaseInstance = new PetaPoco.Database("PMconString"))
{
foreach (var record in recordList)
{
if (databaseInstance.FirstOrDefault<Act_Appointments>("SELECT * FROM AppointmentActivities WHERE AppointmentUniqueId =@0", record.AppointmentUniqueId) == null)
{
databaseInstance.Insert("AppointmentActivities", "Id", record);
recordsInserted++;
}
else
{
duplicates++;
}
}
}
log4net.LogManager.GetLogger("AppInfoLogger").Info("[Insert Appointment Data To DB]" + "[ Records Inserted: " + recordsInserted.ToString() + " ]"+ "[ Duplicates Not Inserted: " + duplicates.ToString() + " ]");
return true;
}
catch (Exception ex)
{
log4net.LogManager.GetLogger("AppErrorLogger").Error("[ReconcileEvents]" + JsonConvert.SerializeObject(ex));
log4net.LogManager.GetLogger("EmailLogger").Error("[ReconcileEvents]" + JsonConvert.SerializeObject(ex));
return false;
}
}
PS.
我会将此开放 10 天,以听取社区的反馈,并查看是否有不同的方法来解决我正在尝试做的事情。