在 SQLite3 中插入​​和返回自动标识

Oct*_*oid 5 c# database sqlite

我试图找出在向数据库中插入一行时获取最后一个 ID 的最佳方法。

它是一个基本的库,它使用System.Data.SQLite.

该库可以从控制台应用程序、表单应用程序、网站、服务、单线程、多线程调用 - 因此虽然这个库非常小且简单,但重要的是每次调用它都是无状态的、稳定的和准确的。

在我使用的主要 SQL 库中OUTPUT inserted.id,这使事情变得非常简单,但据我所知,这在 SQLite 中不可用。我确实发现有一两个人提到了它,但它似乎对我不起作用。

如果没有,我看到另一种方法是创建一个游标并使用它来跟踪最后插入的 id。但是,它被列为扩展名,我似乎在 .NET 库中找不到任何迹象。

我能找到最相关的 .NET 示例使用了让我担心的第二种命令方法。

我担心的是,当引发和记录异常时,通常会很快引发很多异常,我想 100% 确定我正确地链接了 InnerException 链。


  • 我的想法是否正确INSERT INTO...... OUTPUT inserted.idSQLite 不支持?
  • 假设不是,游标是获取最后插入的 id 的最佳方式,而不会出现并发请求问题吗?
  • 如果这是最好的方法,是否SELECT last_insert_rowid()仅限于当前光标?

Ice*_*ind 5

像这样的事情是你需要做的:

using (var connection = new SQLiteConnection(ConnectionString))
{
    using (var command = new SQLiteCommand())
    {
        string sql = "INSERT INTO MyTable (Field1) VALUES (@val1); SELECT last_insert_rowid();";

        command.Connection=connection;
        command.CommandType = CommandType.Text;
        command.CommandText = sql;

        command.Parameters.Add(new SQLiteParameters("@val1", DbType.String) {value = "MyValue"});

        connection.Open();
        object obj = command.ExecuteScalar();
        long id = (long)obj; // Note regardless of data type, SQLite always returns autoincrement fields as long.
        // Do something with id
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,您需要修改 SQL 文本以完全匹配您的需要。

  • 是的,因为对 `command.ExecuteScalar()` 的单次调用会批量执行整个 SQL 语句。因此,只要您在数据库中插入行的方式保持一致,那么并发性就不是问题。 (4认同)