当我向数据库中插入一行时,我试图找出获取最后一个 ID 的最佳方法。
它是一个基本库,它将异常和程序状态数据记录到 SQLite 数据库中,使用System.Data.SQLite
.
该库可以从控制台应用程序、表单应用程序、网站、服务、单线程、多线程调用 - 因此,虽然该库非常小且简单,但重要的是对它的每次调用都是无状态、稳定和准确的。
在我使用的主要 SQL 库中OUTPUT inserted.id
,这使事情变得非常简单,但据我所知,这在 SQLite 中不可用。我确实发现一两个人提到过它,但它似乎对我不起作用。
如果没有,我认为另一种方法是创建一个游标并用它来跟踪最后插入的 id https://stackoverflow.com/questions/6242756/how-to-retrieve-inserted-id-after-inserting-row-in-sqlite-using-python。然而,它被列为扩展,我似乎在 .NET 库中找不到它的任何迹象。
The 我能找到的最相关的 .NET 示例 https://stackoverflow.com/questions/4341178/getting-the-last-insert-id-with-sqlite-net-in-c-sharp使用了让我担心的第二种命令方法。
我担心的是,当引发和记录异常时,通常会很快引发很多异常,并且我想 100% 确定我正确链接了 InnerException 链。
- 我的想法对吗
INSERT INTO
...OUTPUT inserted.id
SQLite 不支持?
- 假设不是,游标是否是获取最后插入的 id 且不会出现并发请求问题的最佳方法?
- 如果这是最好的方法,那就是
SELECT last_insert_rowid()
仅限于当前光标?
您需要做的是这样的事情:
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 文本以完全匹配您的需要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)