Dans cet article, je vais utiliser le terme «identité» de façon interchangeable à noter Auto généré (à partir de RDMS) en général pour des valeurs d'une colonne représentant la clé primaire d'une table. Ce sont les «séquences» en Oracle et "producteurs" de Interbase.
En fait, il existe 3 options pour obtenir la valeur d'identité en utilisant ADO. NET en général:

  1. L'utilisation d'un lot de requêtes (la base de données est évidemment à l'appui de cette)
  2. Utilisez une procédure stockée (comme la commande Insérer) comme ayant un paramètre de sortie de la «Identité» de valeur (ce qui est le plus rapide et donc la méthode recommandée)
  3. Handle Adapter la RowUpdated / RowUpdating événement et publiera un "SELECT @ @ IDENTITY" (dans le cas de SQL Server) dans le code de requête dans ce gestionnaire d'événement (plus lent)

Les deux premières options UpdatedRowSource compter sur la propriété d'un objet de commande de sorte que la nouvelle valeur est propagée à l'objet DataSet. Malheureusement, cette propriété n'a pas été mis en œuvre actuellement 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) indiquant ceci:

  • Delphi début 2005.
  • Ne Fichier | Nouveau, sélectionnez l'option "Application Windows Forms - Delphi for. NET" option.
  • Faites glisser les données à partir de l'Explorateur dbo.Employees la table de base de données Northwind dans MSSQL fournisseur (détails sur la façon de configurer cette connexion peut être trouvé dans cet excellent article de Bob Swart). Utilise une table Employees AutoInc la colonne de clé primaire appelé "EmployeeID"
  • Cliquez avec le bouton droit de la BDPDataAdapter créé et sélectionnez Configuration de l'adaptateur. Cette action fera apparaître le formulaire de configuration de l'adaptateur de données pour la composante bdpAdapter. Modifier la clause SELECT comme il est indiqué dans le tableau suivant et cliquez sur GenerateSQL:

BdpAdapterConfiguration

  • Cliquez sur le fichier et sélectionnez l'onglet "New Dataset" et cliquez sur OK.
  • Set bdpAdapter Active la propriété à True.
  • Cliquez sur les tableaux de la propriété nouvellement créé de données ( "DataSet1"). Cela fera apparaître l'éditeur de tableaux de collecte de biens pour l'ensemble de données. Sélectionner des colonnes, ce qui fera apparaître l'éditeur de colonnes pour les employés Table. Sélectionnez l'option "EmployeeID" la colonne et de modifier les propriétés suivantes:
    • AutoIncrement = True
    • AutoIncrementSeed =- 1
    • AutoIncrementStep =- 1

comme le montre le tableau suivant:

ColumnsCollectionEditor

REMARQUE:Étant donné que les valeurs que nous mettons dans le DataSet sera éliminé de toute façon au cours de l'application de mises à jour de la base de données, puis tout mannequin (unique) de valeur pourrait être utilisée aussi bien. Toutefois, il est une bonne pratique de fixer la valeur AutoIncrement de la colonne représente la clé primaire en tant que véritable domaine et de le rendre unique de prendre des valeurs négatives, de cette façon parce que nous nous appuyons sur les données de propriétés pour obtenir des valeurs uniques temporaire et, en outre, utiliser des valeurs négatives comme Employé temporaire valeurs s'assure qu'il n'ya pas de conflit permanent avec (positive) serveur de base de données des valeurs assignées.

  • Posez une datagrid à la forme de données et définir sa propriété à DataSet1 DataMember et de ses biens à des «employés».
  • Placez un bouton, la renommer comme btnSave et mettre son texte à "Save Changes". Double-cliquez sur le bouton et entrez le code suivant:

procédure TWinForm1.btnSave_Click (sender: System.Object; e: System.EventArgs);
commencer
BdpDataAdapter1.AutoUpdate (DataSet1, «employés», BdpUpdateMode.All, [ "EmployeeID'],[]);
fin;

La 4 eparamètre de la méthode automatique EmployeeID définit comme une colonne en lecture seule (ce qui signifie qu'il ne sera pas inclus dans la dernière clause INSERT), et c'est ce que nous voulons depuis cette valeur sera automatiquement généré à partir du serveur de base de données.

  • Enfin, double-cliquez sur le RowUpdated cas de bdpAdapter et ajouter le texte suivant gestionnaire:

procédure TWinForm1.BdpDataAdapter1_RowUpdated (sender: System.Object; e: Borland.Data.Provider.BdpRowUpdatedEventArgs);
var
Cmd: BdpCommand;
commencer
Si (e.Status = UpdateStatus.Continue) et
(e.StatementType = StatementType.Insert)
puis
commencer
Cmd: = BdpCommand.Create ( "SELECT @ @ IDENTITY", BdpConnection1);
e.Row [ "EmployeeID"]: = Cmd.ExecuteScalar;
e.Row.AcceptChanges;
fin;
fin;

Au début, je vérifier que l'erreur n'est pas venu au cours de la mise à jour de cette rangée (UpdateStatus.Continue) et si la ligne a été enregistré une inséré un. Dans ce cas, je crée un objet de la délivrance du bdpCommand SELECT @ @ IDENTITY requête. Je me suis alors retrouvé affecter la valeur de la ligne actuelle (e.row) et, enfin, je demande e.Row.AcceptChanges pour annuler la modification que j'ai faite depuis le journal des modifications.
Notez que nous devrions utiliser @ @ SCOPE_IDENTITY au lieu de @ @ IDENTITY dans le cas où il y avait des tables de vérification dans la base de données mise à jour automatiquement par le biais de certains de déclenchement (@ @ IDENTITY de la valeur insérée dans la table de vérification et de ne pas le "vrai" tableau, nous mettons à jour) .

Exécutez l'application et d'ajouter quelques lignes:

Addingrows

Cliquez sur le bouton "Enregistrer les modifications" et le EmployeeID valeurs ont été mises à jour automatiquement:

SavedChanges

Des techniques similaires (impliquant le RowUpdating cas) pourrait être utilisé pour obtenir une valeur générée à partir d'un générateur de Interbase préalable à l'application de cette nouvelle valeur à la base de données

Références:

-- Borland Delphi 2005 RAD pour ADO.NET - par Bob Swart
-- Microsoft ADO. NET (Microsoft Press) par David Sceppa
-- Comment utiliser Autoinc champs avec DataSnap par Dan Miser

Average rating: