Dans cet article, je vais utiliser le terme “Identité” de façon interchangeable à noter généré automatiquement (à partir de SGBDR) valeurs habituellement pour une colonne qui représente la clé primaire d'une table. Celles-ci sont appelées “séquences” dans Oracle et “générateurs” en Interbase.
en Fait, il existe 3 options pour obtenir la valeur d'identité en arrière en utilisant ADO .NET en général:
- Utiliser un lot de requêtes (la base de données a évidemment pour cela)
- l'Utilisation d'une procédure stockée (comme la commande Insert) ayant comme paramètre de sortie “l'Identité” de la valeur (c'est le plus rapide et donc la méthode recommandée)
- Adaptateur de Poignée de RowUpdated /RowUpdating de l'événement et de la publication d'une 'SELECT @@IDENTITY' (dans le cas de SQL Server) de la requête dans le code de ce gestionnaire d'événement (le plus lent)
& nbsp
Les deux premières options compter sur UpdatedRowSource propriété d'un objet de Commande de sorte que la nouvelle valeur est retournée à l'objet DataSet. Malheureusement, cette propriété n'a pas été mis en œuvre dans bdpCommand. Cela signifie que la seule option viable est la 3ème, et je vais construire un exemple d'application (contre MS SQL Server base de données Northwind) montrer ceci:
- Début de Delphi 2005.
- Faire Fichier | Nouveau, puis sélectionnez l'Application Windows Forms - Delphi pour .NET' option.
- faites Glisser à partir de l'Explorateur de Données de la dbo.Les employés de la table de base de données de MSSQL fournisseur de détails sur comment configurer cette connexion peut être trouvé dans cet excellent article de Bob Swart). Les employés de table utilise un AutoInc colonne comme clé primaire appelée “Employé”
- clic Droit sur le BDPDataAdapter créé et sélectionnez Configurer l'Adaptateur. Cela fera apparaître les données de configuration de l'adaptateur forme pour la bdpAdapter composant. Modifier la clause SELECT comme il est montré dans l'image ci-dessous et cliquez sur GenerateSQL:
& nbsp
- Cliquez sur le jeu de données et sélectionnez l'onglet “Nouvelles Données” et cliquez sur OK.
- Définir bdpAdapter de la propriété Active à True.
- Cliquez sur les Tables de la propriété du jeu de données nouvellement créé (“Dataset1”). Cela va mettre en place les Tableaux de la collection de l'éditeur de propriétés pour le jeu de données. Sélectionner les Colonnes et cela permet d'ouvrir les Colonnes de l'éditeur de la Table employés. Sélectionnez le “Employé” colonne et modifier les propriétés suivantes:
- AutoIncrement=True
- AutoIncrementSeed=-1
- AutoIncrementStep=-1
< p class='step_content '>comme indiqué dans l'image suivante:
NOTE: Puisque les valeurs que nous allons définir dans le jeu de données sera mis au rebut de toute façon lors de l'application de mises à jour de la base de données, ensuite, toute factice (unique) valeur peut être utilisée aussi bien. Toutefois, il est recommandé de définir l'auto-incrémentation de la valeur de la colonne représentant le champ de clé primaire comme vrai et de lui faire prendre unique des valeurs négatives, car de cette façon, nous nous appuyons sur le jeu de données de propriétés à obtenir temporaire des valeurs uniques et, en outre, l'utilisation de valeurs négatives temporaires EmployeeID valeurs permet de s'assurer qu'il n'y a pas de conflit avec d'permanente (positif) serveur de base de données les valeurs assignées.
- Drop un contrôle datagrid au formulaire et définissez sa propriété datasource à Dataset1 et sa propriété DataMember pour les “employés”.
- Déposez un Bouton, le renommer btnSave et l'ensemble de son Texte sur “Enregistrer les Modifications”. Double-cliquez sur le bouton et entrez le code suivant:
procédure TWinForm1.btnSave_Click(sender: Système.Objet e: Système.EventArgs)
begin
BdpDataAdapter1.AutoUpdate(DataSet1, 'Employés', BdpUpdateMode.Tous, ['Employé'],[])
fin
4èmeparamètre de mise à jour automatique de la méthode définit Employé comme une colonne lecture seule (c'est à dire, qu'il ne sera pas inclus dans le final de l'INSERTION de la clause) et c'est ce que nous voulons puisque cette valeur sera automatiquement généré à partir du serveur de base de données.
- Enfin, double-cliquez sur l'événement RowUpdated de bdpAdapter et ajoutez la fonction suivante:
procédure TWinForm1.BdpDataAdapter1_RowUpdated(sender: Système.Objet e: Borland.Les données.Fournisseur de.BdpRowUpdatedEventArgs)
var
Cmd:BdpCommand
begin
Si (e.Statut=UpdateStatus.Continuer) et
e.StatementType=StatementType.Insérer)
begin
Cmd:=BdpCommand.Create('SELECT @@IDENTITY',BdpConnection1)
e.Row['Employé']:=Cmd.ExecuteScalar
e.Ligne.AcceptChanges
fin
fin
Au début, j'ai constater qu'une erreur s'est pas venu au cours de la mise à jour de cette ligne particulière (UpdateStatus.Continuer) et si la ligne à été sauvé a été inséré. Dans ce cas, je créer un bdpCommand objet de l'émission de la requête SELECT @@IDENTITY. Je puis assigner la valeur récupérée à la ligne courante (e.ligne) et enfin, j'appelle e.Ligne.AcceptChanges pour supprimer la modification que j'ai faite à partir du journal des modifications.
Notez que nous devrions utiliser @@SCOPE_IDENTITY au lieu de @@IDENTITY dans le cas où il y avait de la Vérification des tables dans la base de données mise à jour automatiquement par le biais de certains déclencheur de la prise de @@IDENTITY de la valeur insérée dans la table d'audit et de ne pas la 'vraie' table nous mettons à jour).
Exécutez l'application et ajouter un couple de lignes:
Cliquez sur le bouton “Enregistrer” et le n ° d'Employé valeurs ont été automatiquement mis à jour:
& nbsp
des techniques Similaires (impliquant la RowUpdating événement) peut être utilisée pour obtenir une valeur générée à partir d'un Interbase générateur avant l'application de cette nouvelle valeur de la base de données
& nbsp
Références:
- Borland Delphi 2005 RAD pour ADO.NET - par Bob Swart
- Microsoft ADO .NET (Microsoft Press) par David Sceppa
- Comment faire pour utiliser Autoinc champs avec DataSnap par Dan Avare
& nbsp
& nbsp
Recuperer autoinc les valeurs avec la bdp en delphi 2005
Recuperer autoinc les valeurs avec la bdp en delphi 2005 : Plusieurs milliers de conseils pour vous faciliter la vie.
Dans cet article, je vais utiliser le terme “Identite” de façon interchangeable a noter genere automatiquement (a partir de SGBDR) valeurs habituellement pour une colonne qui represente la cle primaire d'une table. Celles-ci sont appelees “sequences” dans Oracle et “generateurs” en Interbase.
en Fait, il existe 3 options pour obtenir la valeur d'identite en arriere en utilisant ADO .NET en general:
- Utiliser un lot de requetes (la base de donnees a evidemment pour cela)
- l'Utilisation d'une procedure stockee (comme la commande Insert) ayant comme parametre de sortie “l'Identite” de la valeur (c'est le plus rapide et donc la methode recommandee)
- Adaptateur de Poignee de RowUpdated /RowUpdating de l'evenement et de la publication d'une 'SELECT @@IDENTITY' (dans le cas de SQL Server) de la requete dans le code de ce gestionnaire d'evenement (le plus lent)
& nbsp
Les deux premieres options compter sur UpdatedRowSource propriete d'un objet de Commande de sorte que la nouvelle valeur est retournee a l'objet DataSet. Malheureusement, cette propriete n'a pas ete mis en œuvre dans bdpCommand. Cela signifie que la seule option viable est la 3eme, et je vais construire un exemple d'application (contre MS SQL Server base de donnees Northwind) montrer ceci:
- Debut de Delphi 2005.
- Faire Fichier | Nouveau, puis selectionnez l'Application Windows Forms - Delphi pour .NET' option.
- faites Glisser a partir de l'Explorateur de Donnees de la dbo.Les employes de la table de base de donnees de MSSQL fournisseur de details sur comment configurer cette connexion peut etre trouve dans cet excellent article de Bob Swart). Les employes de table utilise un AutoInc colonne comme cle primaire appelee “Employe”
- clic Droit sur le BDPDataAdapter cree et selectionnez Configurer l'Adaptateur. Cela fera apparaître les donnees de configuration de l'adaptateur forme pour la bdpAdapter composant. Modifier la clause SELECT comme il est montre dans l'image ci-dessous et cliquez sur GenerateSQL:
& nbsp
- Cliquez sur le jeu de donnees et selectionnez l'onglet “Nouvelles Donnees” et cliquez sur OK.
- Definir bdpAdapter de la propriete Active a True.
- Cliquez sur les Tables de la propriete du jeu de donnees nouvellement cree (“Dataset1”). Cela va mettre en place les Tableaux de la collection de l'editeur de proprietes pour le jeu de donnees. Selectionner les Colonnes et cela permet d'ouvrir les Colonnes de l'editeur de la Table employes. Selectionnez le “Employe” colonne et modifier les proprietes suivantes:
- AutoIncrement=True
- AutoIncrementSeed=-1
- AutoIncrementStep=-1
< p class='step_content '>comme indique dans l'image suivante:
NOTE: Puisque les valeurs que nous allons definir dans le jeu de donnees sera mis au rebut de toute façon lors de l'application de mises a jour de la base de donnees, ensuite, toute factice (unique) valeur peut etre utilisee aussi bien. Toutefois, il est recommande de definir l'auto-incrementation de la valeur de la colonne representant le champ de cle primaire comme vrai et de lui faire prendre unique des valeurs negatives, car de cette façon, nous nous appuyons sur le jeu de donnees de proprietes a obtenir temporaire des valeurs uniques et, en outre, l'utilisation de valeurs negatives temporaires EmployeeID valeurs permet de s'assurer qu'il n'y a pas de conflit avec d'permanente (positif) serveur de base de donnees les valeurs assignees.
- Drop un controle datagrid au formulaire et definissez sa propriete datasource a Dataset1 et sa propriete DataMember pour les “employes”.
- Deposez un Bouton, le renommer btnSave et l'ensemble de son Texte sur “Enregistrer les Modifications”. Double-cliquez sur le bouton et entrez le code suivant:
procedure TWinForm1.btnSave_Click(sender: Systeme.Objet e: Systeme.EventArgs)
begin
BdpDataAdapter1.AutoUpdate(DataSet1, 'Employes', BdpUpdateMode.Tous, ['Employe'],[])
fin
4emeparametre de mise a jour automatique de la methode definit Employe comme une colonne lecture seule (c'est a dire, qu'il ne sera pas inclus dans le final de l'INSERTION de la clause) et c'est ce que nous voulons puisque cette valeur sera automatiquement genere a partir du serveur de base de donnees.
- Enfin, double-cliquez sur l'evenement RowUpdated de bdpAdapter et ajoutez la fonction suivante:
procedure TWinForm1.BdpDataAdapter1_RowUpdated(sender: Systeme.Objet e: Borland.Les donnees.Fournisseur de.BdpRowUpdatedEventArgs)
var
Cmd:BdpCommand
begin
Si (e.Statut=UpdateStatus.Continuer) et
e.StatementType=StatementType.Inserer)
begin
Cmd:=BdpCommand.Create('SELECT @@IDENTITY',BdpConnection1)
e.Row['Employe']:=Cmd.ExecuteScalar
e.Ligne.AcceptChanges
fin
fin
Au debut, j'ai constater qu'une erreur s'est pas venu au cours de la mise a jour de cette ligne particuliere (UpdateStatus.Continuer) et si la ligne a ete sauve a ete insere. Dans ce cas, je creer un bdpCommand objet de l'emission de la requete SELECT @@IDENTITY. Je puis assigner la valeur recuperee a la ligne courante (e.ligne) et enfin, j'appelle e.Ligne.AcceptChanges pour supprimer la modification que j'ai faite a partir du journal des modifications.
Notez que nous devrions utiliser @@SCOPE_IDENTITY au lieu de @@IDENTITY dans le cas ou il y avait de la Verification des tables dans la base de donnees mise a jour automatiquement par le biais de certains declencheur de la prise de @@IDENTITY de la valeur inseree dans la table d'audit et de ne pas la 'vraie' table nous mettons a jour).
Executez l'application et ajouter un couple de lignes:
Cliquez sur le bouton “Enregistrer” et le n ° d'Employe valeurs ont ete automatiquement mis a jour:
& nbsp
des techniques Similaires (impliquant la RowUpdating evenement) peut etre utilisee pour obtenir une valeur generee a partir d'un Interbase generateur avant l'application de cette nouvelle valeur de la base de donnees
& nbsp
References:
- Borland Delphi 2005 RAD pour ADO.NET - par Bob Swart
- Microsoft ADO .NET (Microsoft Press) par David Sceppa
- Comment faire pour utiliser Autoinc champs avec DataSnap par Dan Avare
& nbsp
& nbsp