Ich habe eine Tabelle Nachrichten mit Spalten-ID (Primärschlüssel, automatische Inkrementierung) und Inhalt (Text).
Ich habe eine Tabelle Benutzer mit Spalten Benutzername (Primärschlüssel, Text) und Hash.
Eine Nachricht wird von einem Absender (Benutzer) an viele Empfänger (Benutzer) gesendet, und ein Empfänger (Benutzer) kann viele Nachrichten haben.
Ich habe eine Tabelle Messages_Recipients mit zwei Spalten erstellt: MessageID (bezogen auf die ID-Spalte der Messages-Tabelle und Recipient (bezogen auf die Spalte Benutzername in der Users-Tabelle). Diese Tabelle repräsentiert die Viele-zu-Viele-Beziehung zwischen Empfängern und Nachrichten.
Die Frage, die ich habe, ist folgende. Die ID einer neuen Nachricht wird erstellt, nachdem sie in der Datenbank gespeichert wurde. Aber wie kann ich einen Verweis auf die MessageRow halten, die ich gerade hinzugefügt habe, um diese neue MessageID abzurufen?
Ich kann natürlich immer in der Datenbank nach der zuletzt hinzugefügten Zeile suchen, aber das könnte möglicherweise eine andere Zeile in einer Multithread-Umgebung zurückgeben?
EDIT: Wie ich es für SQLite verstehe, können Sie die verwenden SELECT last_insert_rowid()
. Aber wie rufe ich diese Anweisung von ADO.Net auf?
Mein Persistenzcode (Nachrichten und Nachrichtenempfänger sind 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);
}