首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从SQLite表中检索最后一个自动递增的ID?

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

Stack Overflow用户
提问于 2010-01-24 21:07:38
回答 5查看 129.1K关注 0票数 91

我有一个包含列ID (主键、自动增量)和内容(文本)的Messages表。

我有一个表Users,其中包含username (主键、文本)和Hash列。

一条消息由一个发送者(用户)发送给多个接收者(用户),并且一个接收者(用户)可以有多个消息。

我创建了一个包含两列的表Messages_Recipients : MessageID (引用Messages表的ID列)和Recipient (引用Users表中的username列)。此表表示收件人和邮件之间的多对多关系。

所以,我的问题是。新消息的ID将在存储到数据库中后创建。但是,为了检索这个新的MessageID,我如何才能保持对刚添加的MessageRow的引用呢?

当然,我总是可以在数据库中搜索最后添加的行,但这可能会在多线程环境中返回不同的行?

编辑:据我所知,对于SQLite,你可以使用SELECT last_insert_rowid()。但是如何在ADO.Net中调用该语句呢?

我的持久化代码(messages和messagesRecipients都是DataTables):

代码语言:javascript
复制
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);
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-25 04:14:04

对于SQL Server,您可以选择SCOPE_IDENTITY()来获取当前进程的最后一个标识值。

对于SQlite,它看起来像是一个自动增量,您可以这样做

代码语言:javascript
复制
SELECT last_insert_rowid()

紧跟在插入之后。

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

在回答您的注释时,您可能希望使用SQL或OleDb代码,如下所示:

代码语言:javascript
复制
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();
}
票数 98
EN

Stack Overflow用户

发布于 2010-02-07 22:13:40

另一种选择是查看系统表sqlite_sequence。如果您创建了任何具有自动增量主键的表,则您的sqlite数据库将自动拥有该表。这个表用于sqlite跟踪自动增量字段,这样即使在删除一些行或某些插入失败之后,它也不会重复主键(在这里http://www.sqlite.org/autoinc.html可以了解更多信息)。

因此,使用这个表还有一个额外的好处,即使在插入了其他内容之后(当然是在其他表中),也可以找到新插入的项的主键。在确保插入成功之后(否则您将得到一个错误的数字),您只需执行以下操作:

代码语言:javascript
复制
select seq from sqlite_sequence where name="table_name"
票数 116
EN

Stack Overflow用户

发布于 2017-04-05 03:10:53

来自@polyglot解决方案的示例代码

代码语言:javascript
复制
SQLiteCommand sql_cmd;
sql_cmd.CommandText = "select seq from sqlite_sequence where name='myTable'; ";
int newId = Convert.ToInt32( sql_cmd.ExecuteScalar( ) );
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2127138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档