当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《如何从SQLite表中检索最后一个自动增量ID?》经验,为你挑选了4个好方法。

我有一个表列消息列ID(主键,自动增量)和内容(文本).
我有一个表用户名列有用户名(主键,文本)和哈希.
一个发件人(用户)向许多收件人(用户)发送邮件,收件人(用户)可以收到许多邮件.
我创建了一个包含两列的表Messages_Recipients:MessageID(引用Messages表的ID列和Recipient(引用Users表中的用户名列).此表表示收件人和邮件之间的多对多关系.

所以,我的问题是这个.在将新消息存储在数据库中之后,将创建新消息的ID.但是,我如何保存对刚刚添加的MessageRow的引用以便检索这个新的MessageID?
我总是可以在数据库中搜索最后添加的行,但是这可能会在多线程环境中返回一个不同的行?

编辑:据我所知,SQLite你可以使用SELECT last_insert_rowid().但是如何从ADO.Net中调用此声明?

我的持久性代码(messages和messagesRecipients是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);
}

polyglot.. 100

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

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

select seq from sqlite_sequence where name="table_name"


MikeW.. 75

使用SQL Server,您可以选择SCOPE_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();
}

再次感谢你!不幸的是,它不起作用,因为在关闭用于更新DataTable的连接之前需要调用last_insert_rowid()函数.这可能是SQLite的一个怪癖,但...... (2认同)

@Dabblernl似乎另一个答案更可靠,如果您觉得另一个更有帮助,您可能想要更改已接受的答案 (2认同)


Fidel.. 8

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

这是他们在doco中陈述的地方:

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

那是来自sqlite.org doco



1> polyglot..:

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

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

select seq from sqlite_sequence where name="table_name"



2> MikeW..:

使用SQL Server,您可以选择SCOPE_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();
}


再次感谢你!不幸的是,它不起作用,因为在关闭用于更新DataTable的连接之前需要调用last_insert_rowid()函数.这可能是SQLite的一个怪癖,但......
@Dabblernl似乎另一个答案更可靠,如果您觉得另一个更有帮助,您可能想要更改已接受的答案

3> Fidel..:

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

这是他们在doco中陈述的地方:

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

那是来自sqlite.org doco



4> 小智..:

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

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

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有