相关疑难解决方法(0)

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

我有一个表列消息列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);
}
Run Code Online (Sandbox Code Playgroud)

database sqlite primary-key auto-increment junction-table

72
推荐指数
5
解决办法
10万
查看次数

如何使用 Diesel 和 SQLite 获取新创建值的 id?

DieselSqliteBackend没有实现该SupportsReturningClause特征,因此该get_result方法不能用于检索新创建的值。

还有其他方法可以找出插入行的 id 吗?Python对此有一个解决方案。到目前为止我找到的唯一解决方案是使用 UUID 作为 ids 而不是自动增量字段。

sqlite rust rust-diesel

7
推荐指数
1
解决办法
2966
查看次数

在 SQLite3 中插入​​和返回自动标识

我试图找出在向数据库中插入一行时获取最后一个 ID 的最佳方法。

它是一个基本的库,它使用System.Data.SQLite.

该库可以从控制台应用程序、表单应用程序、网站、服务、单线程、多线程调用 - 因此虽然这个库非常小且简单,但重要的是每次调用它都是无状态的、稳定的和准确的。

在我使用的主要 SQL 库中OUTPUT inserted.id,这使事情变得非常简单,但据我所知,这在 SQLite 中不可用。我确实发现有一两个人提到了它,但它似乎对我不起作用。

如果没有,我看到另一种方法是创建一个游标并使用它来跟踪最后插入的 id。但是,它被列为扩展名,我似乎在 .NET 库中找不到任何迹象。

我能找到最相关的 .NET 示例使用了让我担心的第二种命令方法。

我担心的是,当引发和记录异常时,通常会很快引发很多异常,我想 100% 确定我正确地链接了 InnerException 链。


  • 我的想法是否正确INSERT INTO...... OUTPUT inserted.idSQLite 不支持?
  • 假设不是,游标是获取最后插入的 id 的最佳方式,而不会出现并发请求问题吗?
  • 如果这是最好的方法,是否SELECT last_insert_rowid()仅限于当前光标?

c# database sqlite

5
推荐指数
1
解决办法
1万
查看次数