C# 如何批量查询SQLite数据库

C# 如何批量查询SQLite数据库,c#,sql,.net,sqlite,C#,Sql,.net,Sqlite,我正在将C#与.NET4.5一起使用。我正在制作一个收集特定数据的刮板。每次刮取一个值时,我都需要确保它没有被添加到SQLite数据库中 为此,每次刮取一个值时,我都会进行一次调用,以查询db,检查它是否包含该值,如果不包含,我会进行另一次调用,将该值插入db 由于我每秒要刮取多个值,这将非常占用IO,需要不断调用db 我的问题是,有没有更好的办法?也许我可以将刮取的值排队,然后立即运行批处理查询?这可能吗?我认为有三种方法: 使用插入或忽略,如果条目已经存在(基于主键和唯一字段),则会拒绝该条

我正在将C#与.NET4.5一起使用。我正在制作一个收集特定数据的刮板。每次刮取一个值时,我都需要确保它没有被添加到SQLite数据库中

为此,每次刮取一个值时,我都会进行一次调用,以查询db,检查它是否包含该值,如果不包含,我会进行另一次调用,将该值插入db

由于我每秒要刮取多个值,这将非常占用IO,需要不断调用db


我的问题是,有没有更好的办法?也许我可以将刮取的值排队,然后立即运行批处理查询?这可能吗?

我认为有三种方法:

  • 使用
    插入或忽略
    ,如果条目已经存在(基于主键和唯一字段),则会拒绝该条目。或者干脆
    INSERT
    (或其等价物(
    INSERT或ABORT
    ),它将返回
    SQLITE\u CONSTRAINT
    ,如果要计算失败的插入次数,您必须捕获并管理该值
  • 在数据库外部累积您想要进行的更新。当您累积了足够的/all之后,启动事务(
    BEGIN;
    ),执行插入(您也可以在此处使用
    INSERT或IGNORE
    ),提交事务(
    commit;
  • 如果您的数据模型允许,您可以预先获取您已经拥有的项目列表,并根据该列表进行检查

  • #1听起来很有趣…这会将我当前的调用减半。我假设如果插入失败,这会引发异常,对吗?对于#2,我能知道每次尝试插入的结果吗?说明在忽略时,不会返回错误。因此,不会有任何异常或警告说某个项被忽略。至于#2,如果使用
    INSERT或IGNORE
    ,则在相同的情况下,成功时不会发出警告。但是,默认设置为
    INSERT
    (相当于
    INSERT或ABORT
    )冲突时,它将返回
    SQLITE\u约束
    。您需要捕获该返回值并实现您自己的错误/日志系统。但是,如果您使用
    INSERT
    而没有冲突解决算法(即
    插入或中止
    )在事务内部,插入失败将停止该事务,并将回滚自事务开始以来的所有先前更改。我认为您不希望这样。嗯,那么很遗憾,我回到了原点。如果有一种方法可以判断插入或忽略是否未成功,那么这将是完美的解决方案。不要插入或忽略,只需插入即可。您将得到警告。您可以找到文档。