c# - SQLite - 检索最后一行的ID

标签 c# sqlite ado.net thread-safety

我面临着检索最后添加的行 ID 的常见问题。问题是,我希望这个操作尽可能原子,以完全线程安全。我用ADO.NET wrapper围绕 SQLite。

这是我的研究:

  • SQLiteConnection 类提供 LastInsertRowId 属性,该属性返回上次成功插入操作的 RowId。但是,如果某个线程 had enough luck在评估 LastInsertRowId 期间将一些数据推送到表中,我会得到一些错误的 ID(很可能不是我正在搜索的 ID)。
  • SQLite 维护一个名为 sqlite_sequence 的表,其中存储用于生成 AUTOINCRMENT 键的值。我可以手动增加其中一个值,然后插入具有预定义 Id 值的行(我使用存储过程在 MySQL 中执行类似操作)。问题是,如果我希望这个解决方案是安全的,我必须实现从此表中进行选择、增量和更新作为原子过程,但我不知道该怎么做。
  • 适用于 SQLite 的 Android API 包含 insert方法,它返回最后添加的行的 ID,但我在我使用的包装器中找不到这样的方法。

所以问题是:如何以线程安全的方式检索最后添加的行的 ID?

最佳答案

我们处理这个问题的方法是启动一个事务,执行插入或更新,执行 SELECT last_insert_rowid ()(检索其结果),然后提交事务。

由于事务性质以及此操作返回当前连接的信息,而不是与数据库的任何其他连接的信息,这应该是原子的。

关于c# - SQLite - 检索最后一行的ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17634795/

相关文章:

c# - 在回发时打开新窗口

java - 从 Android SQlite 数据库获取 ListView 的行 ID

r - 使用数据框更新表

c# - AddWithValue 参数为 NULL 时的异常

c# - 在 Windows 8 和 Windows Phone 8 中使用数据库的正确方法

c# - 使用 NEST 从何处获取 ElasticSearch 文档版本

c# - 检查日期范围是否在日期范围内

mysql - 将 MySQL 转换为 SQLite

c# - 如何将 DataTable 序列化为 json 或 xml

c# - 使用带有 connection.open 的语句