Je possède une table Messages avec les colonnes ID (clé primaire, auto-incrément) et Content (texte).
Je possède une table Utilisateurs avec les colonnes nom d'utilisateur (clé primaire, texte) et Hash.
Un message est envoyé par un Expéditeur (utilisateur) à de nombreux destinataires (utilisateurs) et un destinataire (utilisateur) peut avoir de nombreux messages.
J'ai créé une table Messages_Recipients avec deux colonnes : MessageID (faisant référence à la colonne ID de la table Messages) et Recipient (faisant référence à la colonne nom d'utilisateur dans la table Utilisateurs). Cette table représente la relation de plusieurs à plusieurs entre les destinataires et les messages.
Donc, la question que je me pose est la suivante. L'ID d'un nouveau message sera créé après qu'il a été stocké dans la base de données. Mais comment puis-je conserver une référence à la ligne de Message que je viens d'ajouter afin de récupérer ce nouvel ID de Message?
Je peux toujours chercher dans la base de données la dernière ligne ajoutée bien sûr, mais cela pourrait éventuellement renvoyer une ligne différente dans un environnement multi-threaded?
MODIFIER : Tel que je le comprends pour SQLite, vous pouvez utiliser SELECT last_insert_rowid()
. Mais comment puis-je appeler cette instruction depuis ADO.Net?
Mon code de persistence (messages et messagesRecipients sont des 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;//J'espérais que messagerow retiendrait une
//référence à la nouvelle ligne dans la table Messages, mais ce n'est pas le cas.
foreach (var recipient in message.Recipients)
{
var row = messagesRecipients.NewMessages_RecipientsRow();
row.Recipient = recipient;
//row.MessageID= Comment le trouver ??
messagesRecipients.AddMessages_RecipientsRow(row);
UpdateMessagesRecipients();//méthode non affichée
}
}
private void UpdateMessages()
{
messagesAdapter.Update(messages);
messagesAdapter.Fill(messages);
}