【问题标题】:Why does my transaction fail when exceeding a certain amount of inserts?为什么我的交易在超过一定数量的插入时会失败?
【发布时间】:2018-08-27 18:20:19
【问题描述】:

我正在尝试使用事务将大量数据插入 SQLite 数据库。

using (var transaction = database.BeginTransaction())
      {
          foreach(var i in Enumerable.Range(0, _wordCount))
          {
              statement.CommandText = $"INSERT INTO Hashes (word, hash) VALUES ('{words[i]}', '{hashes[i]}')";
              statement.ExecuteNonQuery();
          }

          transaction.Commit();
      }

上述代码适用于 10 - 12k 范围内的少量数据,但是,任何超过 12k 标记的数据似乎都会崩溃并出现以下错误

'SQL logic error near "d": syntax error'

在线资源表明,对于通过单个事务可以完成的插入次数不应该有限制,因此无论插入次数如何,事务都可以正常运行

当超过 12,000 次插入时,我有什么遗漏或者我的交易可能失败的任何原因吗?

【问题讨论】:

  • 只有当您插入超过 12 000 条记录时才会发生这种情况?
  • 不完全是 12,000。它在 12,000 到 12,400 之间崩溃
  • 我的猜测是其中一个单词包含一个单引号。无论如何,请使用参数。
  • 是的,使用带有占位符的预处理语句,而不是直接在查询中插入未知文本。这就是您收到语法错误的原因。 (顺便说一句,我刚刚运行了一个脚本,在一个事务中插入了近 300,000 行。你的问题与事务或限制或类似的东西无关。)

标签: c# sqlite


【解决方案1】:

使用 Dirk 和 Shawn 推荐的参数解决

【讨论】:

  • 理想情况下,您应该始终使用参数而不是连接字符串,因为它会在某些情况下停止 SQL 注入。
猜你喜欢
  • 1970-01-01
  • 2021-08-03
  • 2011-07-04
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
相关资源
最近更新 更多