在SQLite3中插入并返回自动同一性

时间:2015-06-08 17:48:04

标签: c# database sqlite

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

这是一个基本库,它使用System.Data.SQLite将异常和程序状态数据记录到SQLite数据库中。

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

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

如果没有,我认为另一种方法是create a cursor and use that to track the last inserted id。但是,这被列为扩展名,我似乎无法在.NET库中找到它的任何迹象。

most relevant .NET example I could find使用了令我担忧的第二种命令方式。

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

  • 我是否正确地认为INSERT INTO ... OUTPUT inserted.id在SQLite中不受支持?
  • 假设没有,光标是获取最后插入ID的最佳方式,而不会出现并发请求问题吗?
  • 如果这是最佳方法,SELECT last_insert_rowid()是否仅限于当前光标?

3 个答案:

答案 0 :(得分:1)

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

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
    }
}

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

答案 1 :(得分:1)

从 3.35 版开始,SQLite 支持 RETURNING 语句:see here

答案 2 :(得分:0)

对SQLite使用C#(。net 4.0),SQLiteConnection类的属性LastInsertRowId等于最近插入(或更新)元素的主要整数键。

如果表没有主整数键(在这种情况下,rowID是列自动创建),则返回rowID。

这样的事情会起作用:

long rowID;
using (SQLiteConnection con = new SQLiteConnection([datasource])
{
    SQLiteTransaction transaction = null;
    transaction = con.BeginTransaction();
    [execute insert statement]

    rowID = con.LastInsertRowId;

    transaction.Commit()
}

有关详细信息,请查看此link