[ADO.NET] Lecture d'une clé primaire (base sql) avec SCOPE IDENTITY
Je suis confronté à une petite difficulté.
Je développe une petite application de gestion de dossiers utilisant un treeview ; lorsque l'utilisateur veut ajouter un dossier, je crée une nouvelle ligne dans la base de données et un nouveau noeud dans le treeview.
Je souhaiterais affecter la valeur de la clé primaire (auto-incrémentée) de la nouvelle ligne à la propriété Tag de mon noeud.
Or, au moment où je crée la ligne dans la base de donnée, il m'est impossible de lire cette valeur (j'ai toujours "-1" en retour).
Idéalement, j'aimerais pouvoir lire cette valeur avant l'update (j'imagine que le moteur de base de données à déjà dû la définir à ce moment) mais après ça va aussi, si je suis sûr qu'il s'agit bien de la clé primaire de ma nouvelle ligne.
Voici le code qui crée la ligne (rien d'extraordinaire) :
Code:
1 2 3 4 5 6 7
| ObjetDataRow = frmMain.DossiersDataSet.Tables("Dossiers").NewRow()
ObjetDataRow("Dossier") = "Nouveau dossier..."
frmMain.DossiersDataSet.Tables("Dossiers").Rows.Add(ObjetDataRow)
frmMain.DossiersTableAdapter.Update(frmMain.DossiersDataSet.Dossiers) |
Quelle instruction dois-je utiliser et à quel moment pour avoir la valeur de la clé primaire qui figurera en définitif dans la table ?
Ou pour résumer, comment retrouver avec certitude ma ligne dans la base de données (dans la cas où d'autres auraient été créées par un autre utilisateur entre temps) ??
D'avance merci :)
Lecture d'une clé primaire (base sql) avec SCOPE IDENTITY
Fin du suspense :D
Alors, pour commencer, j'ai laissé tomber le format de base de données SQL CE 3.5, qui ne prend pas en compte la fonction SCOPE IDENTITY mais uniquement @@IDENTITY.
Ne me demandez pas la différence, je suis déjà assez perturbé comme ça :mrgreen:
Je suis donc passé à une base sql tout ce qu'il y a de plus normal (*.mdf).
Et avec le code suivant :
Code:
Imports System.Data.SqlClient
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| Dim query As String = "Insert Into Dossiers (Dossier) Values (@Dossier);SELECT Scope_Identity();"
Dim ID As Integer
Dim connect As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=" & dbFile & ";Integrated Security=True;User Instance=True"
Using conn As New SqlConnection(connect)
Using cmd As New SqlCommand(query, conn)
cmd.Parameters.AddWithValue("@Dossier", "Hellooo les amis")
conn.Open()
ID = cmd.ExecuteScalar()
MsgBox(Str(ID))
End Using
End Using |
tout fonctionne à merveille !
Il y a d'autres méthodes, avec procédure stockée (lien TRÈS utile) mais ce sera pour une prochaine fois.
Merci à ceux qui m'ont apporté leur aide. Rendez-vous au prochain casse-tête pour newbies de Tonton Bill :mouarf: