比较特定列时防止重复插入 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 天,以听取社区的反馈,并查看是否有不同的方法来解决我正在尝试做的事情。