在C#中使用SQLite.NET获取最后一个插入ID

van*_*eto 22 c# sql sqlite

我有一个简单的问题,一个不那么简单的解决方案......我目前正在将一些数据插入到这样的数据库中:

                kompenzacijeDataSet.KompenzacijeRow kompenzacija = kompenzacijeDataSet.Kompenzacije.NewKompenzacijeRow();
                kompenzacija.Datum = DateTime.Now;
                kompenzacija.PodjetjeID = stranka.id;
                kompenzacija.Znesek = Decimal.Parse(tbZnesek.Text);

                kompenzacijeDataSet.Kompenzacije.Rows.Add(kompenzacija);

                kompenzacijeDataSetTableAdapters.KompenzacijeTableAdapter kompTA = new kompenzacijeDataSetTableAdapters.KompenzacijeTableAdapter();
                kompTA.Update(this.kompenzacijeDataSet.Kompenzacije);

                this.currentKompenzacijaID = LastInsertID(kompTA.Connection);
Run Code Online (Sandbox Code Playgroud)

最后一行非常重要.为什么我提供连接?那么有一个名为last_insert_rowid()的SQLite函数可以调用并获取最后一个插入ID.问题是它绑定到一个连接,.NET似乎重新打开并关闭每个数据集操作的连接.我以为从表适配器获取连接会改变一些事情.但事实并非如此.

有谁知道如何解决这个问题?也许从哪里获得持续的连接?或者更优雅的东西?

谢谢.

编辑:

这也是事务的问题,如果我想使用事务,我需要相同的连接,所以这也是一个问题......

Ale*_*ith 65

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

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

有关更多信息,请参阅https://www.sqlite.org/c3ref/last_insert_rowid.html.

至于在单个事务中包装多个命令,在事务开始之后和提交之前输入的任何命令都是一个事务的一部分.

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

    ... [execute insert statement]

    rowID = con.LastInsertRowId;

    transaction.Commit()
}
Run Code Online (Sandbox Code Playgroud)

  • 这需要更多的赞成.就我看来,这是获得更新应用程序的方法. (3认同)

Wil*_*ler 46

select last_insert_rowid();
Run Code Online (Sandbox Code Playgroud)

您需要将其作为标量查询执行.

string sql = @"select last_insert_rowid()";
long lastId = (long)command.ExecuteScalar(sql); // Need to type-cast since `ExecuteScalar` returns an object.
Run Code Online (Sandbox Code Playgroud)

  • `long`值类型已经是`Int64`. (8认同)
  • rowid应该转换为Int64:`var result =(Int64)command.ExecuteScalar(sql);` (2认同)

Ern*_*son 9

我正在使用 Microsoft.Data.Sqlite 包,但没有看到 LastInsertRowId 属性。但您不必创建第二次数据库访问来获取最后一个 id。相反,将两个 sql 语句组合成一个字符串。

string sql = @"
    insert into MyTable values (null, @name);  
    select last_insert_rowid();";

using (var cmd = conn.CreateCommand()) {
    cmd.CommandText = sql;
    cmd.Parameters.Add("@name", SqliteType.Text).Value = "John";
    int lastId = Convert.ToInt32(cmd.ExecuteScalar());
}
Run Code Online (Sandbox Code Playgroud)

  • Dotnet 5.0 w Microsoft.Data.Sqlite pkg 5.0.1。这是唯一对我有用的解决方案,因为 SqliteConnection 类上不存在“LastInsertRowId”属性。 (2认同)

Gre*_*ier 7

last_insert_rowid()是解决方案的一部分.它返回行号,而不是实际ID.

cmd = CNN.CreateCommand();
cmd.CommandText = "SELECT last_insert_rowid()";
object i = cmd.ExecuteScalar();

cmd.CommandText = "SELECT " + ID_Name + " FROM " + TableName + " WHERE rowid=" + i.ToString();
i = cmd.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)