Aganstrong 2024-03-08 19:46 采纳率: 56.6%
浏览 6

插入数据时如何防止数据重复

我有一个数据表DataTable,
id时实时生成的,在批量插入这个数据表时,如何防止我这个表插入两次?

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-08 19:46
    关注

    引自免费微信小程序:皆我百晓生

    在C#中,为了避免在向DataTable批量插入数据时出现重复记录,你可以通过以下几种方法实现:

    1. 唯一键约束: 如果你的数据表映射到了数据库中的某个表,并且id是数据库表的主键或唯一键,那么数据库会自动处理重复插入的问题。尝试插入具有已存在id值的新行时,数据库会抛出异常。

    2. HashSet集合: 在内存中使用HashSet来存储已经插入过的id,每次插入前检查id是否已存在于HashSet中。

      HashSet<int> insertedIds = new HashSet<int>();
      
      foreach (var item in batchData)
      {
          if (!insertedIds.Contains(item.Id))
          {
              dataTable.Rows.Add(item.Id, item.OtherColumn1, item.OtherColumn2);
              insertedIds.Add(item.Id);
          }
      }
      
    3. ** LINQ 查询**: 如果DataTable已经在内存中并且很大,不适合遍历,可以先查询DataTable中是否存在相同id的行,再决定是否插入。

      foreach (var item in batchData)
      {
          if (!dataTable.AsEnumerable().Any(row => row.Field<int>("id") == item.Id))
          {
              dataTable.Rows.Add(item.Id, item.OtherColumn1, item.OtherColumn2);
          }
      }
      
    4. 数据库事务与唯一索引结合: 如果是在数据库层面操作,开启事务,在插入前执行一次SELECT COUNT(*) FROM your_table WHERE id = @newId,如果结果为0,则执行INSERT语句并提交事务,否则回滚事务。

    5. 实体框架(EF)或其他ORM: 若使用EF Core等ORM工具,可在模型类上设置 [DatabaseGenerated(DatabaseGeneratedOption.Identity)][Index(IsUnique = true)] 来确保唯一性。

    请注意选择最适合您场景的方法,上述代码示例假设您的数据项是一个包含id属性的对象列表。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月8日

悬赏问题

  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥30 BC260Y用MQTT向阿里云发布主题消息一直错误
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)