C# 在比较特定列时防止重复插入SQL db,必须使用PetaPoco

C# 在比较特定列时防止重复插入SQL db,必须使用PetaPoco,c#,sql,petapoco,C#,Sql,Petapoco,背景信息 我目前正在开发一个电子邮件爬虫程序,它将在数据库中记录我为获取信息而爬虫的电子邮件。目前,我的公司限制我使用Petapoco进行代码维护。我正在运行的当前问题是重复记录正在记录到数据库中。我一直在寻找可以给我一个如何实现这一点的提示的例子或文档,但我没有找到任何 问题 public static async Task<bool> InsertActivitiesData(List<Act_Appointments> recordList) { int r

背景信息

我目前正在开发一个电子邮件爬虫程序,它将在数据库中记录我为获取信息而爬虫的电子邮件。目前,我的公司限制我使用Petapoco进行代码维护。我正在运行的当前问题是重复记录正在记录到数据库中。我一直在寻找可以给我一个如何实现这一点的提示的例子或文档,但我没有找到任何

问题

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],我有一个Id主键,我的表是AppointmentActivities,我试图插入的是记录的类模型

当前代码

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;
    }
}
公共静态异步任务InsertActiviesData(列表记录列表)
{
int recordsInserted=0;
尝试
{
使用(PetaPoco.Database databaseInstance=new PetaPoco.Database(“PMconString”))
{
foreach(记录列表中的var记录)
{
插入(“任命活动”,“Id”,记录);
recordsInserted++;
}
}
log4net.LogManager.GetLogger(“AppInfoLogger”).Info(“[ServiceRan:向DB插入电子邮件数据]”+”[Records Inserted:“+recordsInserted.ToString()+”]);
返回true;
}
捕获(例外情况除外)
{
log4net.LogManager.GetLogger(“AppErrorLogger”).Error(“[ReconcileEvents]”+JsonConvert.SerializeObject(ex));
log4net.LogManager.GetLogger(“EmailLogger”).Error(“[ReconcileEvents]”+JsonConvert.SerializeObject(ex));
返回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;
        }
    }
公共静态异步任务InsertActiviesData(列表记录列表)
{
int recordsInserted=0;
重复整数=0;
尝试
{
使用(PetaPoco.Database databaseInstance=new PetaPoco.Database(“PMconString”))
{                   
foreach(记录列表中的var记录)
{
if(databaseInstance.FirstOrDefault(“从AppointmentActivities中选择*,其中AppointUniqueId=@0”,record.AppointUniqueId==null)
{
插入(“任命活动”,“Id”,记录);
recordsInserted++;
}
其他的
{
复制++;
}                                            
}
}
log4net.LogManager.GetLogger(“AppInfoLogger”).Info(“[Insert Appointment Data To DB]”“+”[Records Inserted:“+recordsInserted.ToString()+”]”+”[Duplicates Not Inserted:“+Duplicates.ToString()+”]);
返回true;
}
捕获(例外情况除外)
{
log4net.LogManager.GetLogger(“AppErrorLogger”).Error(“[ReconcileEvents]”+JsonConvert.SerializeObject(ex));
log4net.LogManager.GetLogger(“EmailLogger”).Error(“[ReconcileEvents]”+JsonConvert.SerializeObject(ex));
返回false;
}
}
PS.

我将把这个网站开放10天,以听取社区的反馈,并看看是否有不同的方法来完成我正在尝试的工作