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

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

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); 

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

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

谢谢。

编辑:

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

 select last_insert_rowid(); 

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

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

使用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() } 

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(); 

SQLiteConnection对象具有该属性,因此不需要其他查询。 在INSERT之后,您只使用了用于INSERT命令的SQLiteConnection对象的LastInsertRowId属性。 LastInsertRowId属性的类型是Int64 。 当然,正如您现在所做的那样,要使自动增量工作,表上的主键必须设置为AUTOINCREMENT字段,这是另一个主题。

  database = new SQLiteConnection(databasePath); public int GetLastInsertId() { return (int)SQLite3.LastInsertRowid(database.Handle); }