如何从SQLite表中检索最后一个自动增加的ID?

我有一个表的消息与列ID(主键,自动增量)和内容(文本)。
我有一个用户列用户名(主键,文本)和哈希。
消息由一个发件人(用户)发送给多个收件人(用户),而收件人(用户)可以有多个消息。
我创build了一个Message_Recipients表,它有两列:MessageID(指的是Messages表和Recipient的ID列(指Users表中的username列)。这个表代表了收件人和消息之间的多对多关系。

所以,我有这个问题。 新消息的ID将在存储在数据库中之后创build。 但是我怎样才能持有我刚添加的MessageRow的引用来检索这个新的MessageID呢?
我总是可以在数据库中search当前添加的最后一行,但是可能会在multithreading环境中返回不同的行?

编辑:据我所知,SQLite你可以使用SELECT last_insert_rowid()。 但是,我怎样从ADO.Net中调用这个语句呢?

我的持久性代码(消息和消息接收者是DataTables):

public void Persist(Message message) { pm_databaseDataSet.MessagesRow messagerow; messagerow=messages.AddMessagesRow(message.Sender, message.TimeSent.ToFileTime(), message.Content, message.TimeCreated.ToFileTime()); UpdateMessages(); var x = messagerow;//I hoped the messagerow would hold a //reference to the new row in the Messages table, but it does not. foreach (var recipient in message.Recipients) { var row = messagesRecipients.NewMessages_RecipientsRow(); row.Recipient = recipient; //row.MessageID= How do I find this?? messagesRecipients.AddMessages_RecipientsRow(row); UpdateMessagesRecipients();//method not shown } } private void UpdateMessages() { messagesAdapter.Update(messages); messagesAdapter.Fill(messages); } 

使用SQL Server,您将selectSCOPE_IDENTITY()以获取当前进程的最后一个标识值。

使用SQlite,它看起来像你会做的自动增量

 SELECT last_insert_rowid() 

你插入后立即。

http://www.mail-archive.com/sqlite-users@sqlite.org/msg09429.html

在回答你的评论来获得这个值你会想要使用SQL或OleDb代码,如:

 using (SqlConnection conn = new SqlConnection(connString)) { string sql = "SELECT last_insert_rowid()"; SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); int lastID = (Int32) cmd.ExecuteScalar(); } 

另外一个select是查看系统表sqlite_sequence 。 如果您使用自动增量主键创build任何表,您的sqlite数据库将自动拥有该表。 这个表是sqlite跟踪的自动增量字段,以便它不会重复主键,即使删除了一些行或一些插入失败后(阅读更多关于这里http://www.sqlite.org/autoinc .html )。

因此,使用这个表格还有额外的好处,即使插入了其他东西(当然也可以在其他表格中),您可以find新插入的项目的主键。 确保插入成功后(否则你将得到一个错误的数字),你只需要做:

 select seq from sqlite_sequence where name="table_name" 

我在multithreading环境中使用SELECT last_insert_rowid()遇到了问题。 如果另一个线程插入到具有autoinc的另一个表中,则last_insert_rowid将从新表中返回autoinc值。

这里是他们在doco中说的地方:

如果单独的线程在sqlite3_last_insert_rowid()函数运行时在同一数据库连接上执行新的INSERT,并因此更改最后一个插入rowid,则sqlite3_last_insert_rowid()返回的值是不可预知的,可能不等于旧的或新的最后一个插入rowid。

这是从sqlite.org doco

以下是来自@polyglot解决scheme的示例代码

SQLiteCommand sql_cmd; sql_cmd.CommandText = "select seq from sqlite_sequence where name='myTable'; "; int newId = Convert.ToInt32( sql_cmd.ExecuteScalar( ) );