In diesem Artikel werde ich den Begriff "Identität" austauschbar zu beachten, Auto generiert (von RDMS) Werte in der Regel für eine Spalte, die den Primärschlüssel einer Tabelle. Diese werden als "Sequenzen" in Oracle und "Generatoren" in Interbase.
Eigentlich, gibt es 3 Optionen, um die Identität Wert zurück mit ADO. NET im Allgemeinen:
- Verwenden Sie eine Batch-Abfrage (die Datenbank natürlich hat zur Unterstützung dieser)
- Verwenden Sie eine gespeicherte Prozedur (wie die Insert-Befehl), die als Ausgabeparameter die "Identität" Wert (dies ist die schnellste und somit empfohlene Methode)
- Handle Adapter's RowUpdated / RowUpdating Veranstaltung und eine "SELECT @ @ IDENTITY" (im Falle von SQL Server) im Code-Abfrage in diesem Event-Handler (langsamste)
Die ersten beiden Optionen auf UpdatedRowSource Eigenschaft eines Command-Objekts, so dass der neue Wert wird wieder vermehrt auf die DataSet-Objekt. Leider ist diese Eigenschaft hat zur Zeit nicht umgesetzt worden in der bdpCommand. Das bedeutet, dass der einzige gangbare Weg ist der 3. ein, und ich werde eine Beispielanwendung (gegen MS SQL Server Northwind-Datenbank), aus dieser:
- Start Delphi 2005.
- Sie Datei | Neu, und wählen Sie die "Windows Forms-Anwendung - Delphi for. NET"-Option.
- Ziehen Sie aus dem Data Explorer dbo.Employees Tabelle aus Nordwind-Datenbank in MSSQL-Provider (Einzelheiten darüber, wie den Aufbau dieser Verbindung finden sich in diesem ausgezeichneten Artikel von Bob Swart). Tabelle "Employees" verwendet ein AutoInc Spalte als Primärschlüssel namens "EmployeeID"
- Rechtsklicken Sie auf das BDPDataAdapter erstellt und wählen Sie Configure Adapter. Dadurch wird das Daten-Adapter-Konfiguration für die bdpAdapter Komponente. Ändern Sie die SELECT-Klausel wie im folgenden Bild und klicken Sie auf GenerateSQL:

- Klicken Sie auf die Registerkarte Datensatz und wählen Sie "Neuer Datensatz" und klicken Sie auf OK.
- Set bdpAdapter Active-Eigenschaft auf True.
- Klicken Sie auf die Tabellen-Eigenschaft des neu geschaffenen DataSet ( "DataSet1"). Daraufhin wird der Tabellen-Sammlung Eigentums-Editor für den Datenbestand. Wählen Sie Spalten und dieser wird das Spalten-Editor für die Mitarbeiter-Tabelle. Markieren Sie das Feld "EmployeeID" Spalte und ändern Sie die folgenden Eigenschaften:
- AutoIncrement = True
- AutoIncrementSeed =- 1
- AutoIncrementStep =- 1
wie es in der folgenden Abbildung:

HINWEIS:Da die Werte werden wir in den DataSet wird verworfen ohnehin während der Anwendung von Updates für die Datenbank, dann wird jedes Dummy (einzigartigen) Wert verwendet werden könnten als gut. Allerdings ist es eine gute Praxis, um die AutoIncrement Wert der Spalte, die die Primärschlüssel-Bereich als wahre und machen es die einzigartige negative Werte, weil dieser Weg setzen wir auf die Eigenschaften des Datenbestands, um temporäre eindeutige Werte und zusätzlich mit negativen Werten wie temporären Personal-Werte stellt sicher, dass es keinen Konflikt mit permanenten (positive) Datenbank-Server zugewiesen Werte.
- Drop ein DataGrid auf die Form und setzen Sie seine Eigenschaft DataSource zu DataSet1 und seine DataMember-Eigenschaft auf "Mitarbeiter".
- Werfen Sie einen Button, benennen Sie es als btnSave, und setzen Sie den Text auf "Änderungen speichern". Doppelklicken Sie auf den Button und geben Sie den folgenden Code ein:
Verfahren TWinForm1.btnSave_Click (Absender: System.Object; e: System.EventArgs);
beginnen
BdpDataAdapter1.AutoUpdate (DataSet1, 'Mitarbeiter', BdpUpdateMode.All, [ "EmployeeID'],[]);
end;
Das 4 thParameter der AutoUpdate-Methode definiert EmployeeID als nur lesen Spalte (das heißt, dass sie nicht in die endgültige INSERT-Klausel) und das ist es, was wir eigentlich wollen, da dieser Wert wird automatisch generiert aus der Datenbank-Server.
- Schließlich, doppelklicken Sie auf die RowUpdated Veranstaltung von bdpAdapter und fügen Sie den folgenden Handler:
Verfahren TWinForm1.BdpDataAdapter1_RowUpdated (Absender: System.Object; e: Borland.Data.Provider.BdpRowUpdatedEventArgs);
var
Cmd: BdpCommand;
beginnen
If (e.Status = UpdateStatus.Continue) und
(e.StatementType = StatementType.Insert)
dann
beginnen
Cmd: = BdpCommand.Create ( "SELECT @ @ IDENTITY", BdpConnection1);
e.Row [ "EmployeeID"]: = Cmd.ExecuteScalar;
e.Row.AcceptChanges;
end;
end;
Auf den ersten, ich feststellen, dass ein Fehler ist nicht, während der Aktualisierung dieser besonderen Reihe (UpdateStatus.Continue) und wenn die Zeile gespeichert wurde ein eingefügt ein. In diesem Fall erstelle ich ein Objekt bdpCommand die Erteilung der SELECT @ @ IDENTITY Abfrage. Ich habe dann ordnen Sie die abgerufenen Wert der aktuellen Zeile (e.row) und schließlich fordere ich e.Row.AcceptChanges um die Änderung zu entfernen ich aus dem Change-Log.
Beachten Sie, dass wir sollten SCOPE_IDENTITY @ @ @ @ statt IDENTITÄT im Fall gab es Audit-Tabellen in der Datenbank automatisch aktualisiert durch einige auslösen (die @ @ IDENTITY den Wert in die Audit-Tabelle und nicht die "echte" Tabelle sind wir Aktualisierung) .
Führen Sie die Anwendung und fügen Sie ein paar Zeilen:

Klicken Sie auf die Schaltfläche "Änderungen speichern" und die Personal-Werte werden automatisch aktualisiert worden:

Ähnliche Techniken (unter Einbeziehung der RowUpdating Veranstaltung) verwendet werden könnten, um einen Wert generiert aus einer Interbase Generator vor der Anwendung dieser neuen Wert in die Datenbank
Referenzen:
-- Borland Delphi 2005 für ADO.NET RAD - von Bob Swart
-- Microsoft ADO. NET (Microsoft Press) von David Sceppa
-- So verwenden Sie Autoinc Felder mit DataSnap von Dan Geizige

Delicious
Digg
Google
Yahoo