我正在尝试找出在向数据库中插入行时获取最后一个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中不受支持?SELECT last_insert_rowid()
是否仅限于当前光标?答案 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