Autoinc Werte in der Bdp in Delphi 2005 abrufen

Autoinc Werte in der Bdp in Delphi 2005 abrufen


In diesem Artikel werde ich den Begriff zu verwenden-Werte 'Identität' Synonym zu beachten, dass Auto (aus RDMS) erzeugt in der Regel für eine Spalte den Primärschlüssel einer Tabelle darstellt. Diese werden in Oracle und 'Generatoren' in Interbase 'Sequenzen' genannt.
Es gibt 3 Möglichkeiten, um den Identitätswert zurück verwenden ADO NET im allgemeinen:

  1. Verwenden Sie eine Batchabfrage (die Datenbank hat offensichtlich zu unterstützen)
  2. Verwenden Sie eine gespeicherte Prozedur (wie der Einfügen-Befehl) hat als Output-Parameter den Wert des 'Identität' (Dies ist die schnellste und damit empfohlene Methode)
  3. Behandeln des Adapters RowUpdated-Ereignis, /RowUpdating und eine '@@IDENTITY auswählen' (bei SQL Server) Abfrage im Code in diesem Ereignishandler (am langsamsten)

Die ersten beiden Optionen beruhen auf UpdatedRowSource-Eigenschaft des ein Command-Objekt, damit der neue Wert zurück an das DataSet-Objekt weitergegeben wird. Leider wurde diese Eigenschaft nicht derzeit in BdpCommand umgesetzt. Das bedeutet, dass die einzig gangbare Option der 3. ist und ich werde eine Beispielanwendung (für MS SQL Server Northwind-Datenbank) zeigen dies zu bauen:

  • Starten Sie Delphi 2005.
  • Datei zu tun | Neu, und wählen Sie die 'Windows Forms-Anwendung – Delphi für net'-Option.
  • Ziehen Sie aus Data Explorer die Dbo. Employees-Tabelle aus der Datenbank Northwind in MSSQL-Anbieter (Details, wie Sie diese Verbindung können in diesen ausgezeichneten Artikel von Bob Swart gefunden werden). Tabelle 'Employees' verwendet eine AutoInc-Spalte als Primärschlüssel bezeichnet 'EmployeeID'
  • Der BDPDataAdapter erstellt einen Rechtsklick und wählen Sie konfigurieren-Adapter. Dieses holt oben die Datenmaske für die Konfiguration von Adapter für die BdpAdapter-Komponente. Ändern Sie die SELECT-Klausel zu, wie in der folgenden Abbildung dargestellt ist, und klicken Sie auf GenerateSQL:

BdpAdapterConfiguration

  • Klicken Sie auf der Registerkarte und wählen Sie 'Neues Dataset' und klicken Sie auf OK.
  • Festlegen Sie BdpAdapter Active-Eigenschaft auf True.
  • Klicken Sie auf die Tables-Eigenschaft des neu erstellten Datasets ('Dataset1'). Dieses holt oben die Tabellen-Auflistungs-Editor-Eigenschaft für das Dataset. Spalten auswählen und dieses holt oben die Spalten-Editor für die Mitarbeiter-Tabelle. Wählen Sie die Spalte 'EmployeeID', und ändern Sie die folgenden Eigenschaften:
    • AutoIncrement = True
    • AutoIncrementSeed =-1
    • AutoIncrementStep =-1

Wie wird in der folgenden Abbildung gezeigt:

ColumnsCollectionEditor

Hinweis: Da die Werte setzen wir im DataSet ohnehin beim Anwenden eines Updates der Datenbank verworfen werden, konnte jeder Attrappe (einmalig) Wert auch verwendet werden. Es ist jedoch empfehlenswert, festlegen den AutoIncrement-Wert der Spalte darstellt das Primärschlüsselfeld als wahr und machen es einzigartig negative Werte zu nehmen, weil auf diese Weise wir auf Dataseteigenschaften setzen, temporäre eindeutige Werte zu erhalten und darüber hinaus mit negativen Werten als temporäre EmployeeID-Werte sicher stellt, dass kein mit permanente (positive) Datenbank Server zugewiesene Werte Konflikt.

  • Löschen Sie ein DataGrid-Steuerelement auf das Formular, und legen Sie die Datasource-Eigenschaft auf Dataset1 und die DataMember-Eigenschaft auf 'Mitarbeiter'.
  • Löschen einer Schaltfläche, benennen Sie sie als Btnsave_onclick und legen Sie ihren Text auf 'Save Changes'. Doppelklicken Sie auf die Schaltfläche, und geben Sie den folgenden Code:

Prozedur TWinForm1.btnSave_Click (Absender: System.Object; e: System.EventArgs);
beginnen
BdpDataAdapter1.AutoUpdate (DataSet1, 'Employees', BdpUpdateMode.All, ['EmployeeID'],[]);
Ende;

Die 4th-Parameter der AutoUpdate-Methode definiert EmployeeID als lesen einzige Spalte (das heißt, dass es in der letzten INSERT-Klausel nicht berücksichtigt werden) und das ist, was wir eigentlich wollen, da dieser Wert vom Datenbankserver automatisch erzeugt werden.

  • Schließlich, doppelklicken Sie auf das RowUpdated-Ereignis des BdpAdapter und fügen Sie den folgenden Ereignishandler:

Prozedur TWinForm1.BdpDataAdapter1_RowUpdated (Absender: System.Object; e: Borland.Data.Provider.BdpRowUpdatedEventArgs);
var
Cmd:BdpCommand;
beginnen
Wenn (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;
Ende;
Ende;

Zuerst ich feststellen, dass ein Fehler bei der Aktualisierung dieser bestimmten Zeile (UpdateStatus.Continue) nicht gekommen ist und wenn die Zeile gespeichert wurde, war eine eingefügte. In diesem Fall erstelle ich ein BdpCommand-Objekt auswählen und @@IDENTITY-Abfrage ausgegeben. Ich weisen dann den abgerufenen Wert der aktuellen Zeile (e.row) und schließlich rufe ich e.Row.AcceptChanges um die Änderung zu entfernen, habe ich aus dem Änderungsprotokoll.
Beachten Sie, dass wir @@SCOPE_IDENTITY statt @@IDENTITY verwenden soll, für den Fall, dass gab es Audit-Tabellen in der Datenbank durch einige Trigger (wobei @@IDENTITY den Wert eingefügt in die Audit-Tabelle und nicht die 'richtigen' Tabelle, die wir aktualisieren) automatisch aktualisiert.

Führen Sie die Anwendung, und fügen Sie ein paar Zeilen:

Addingrows

Klicken Sie auf 'Änderungen speichern' und die EmployeeID-Werte werden automatisch aktualisiert:

SavedChanges

Ähnliche Techniken (bei der das RowUpdating-Ereignis) konnte verwendet werden, um einen generierten Wert aus einer Interbase-Generator vor dem Anwenden dieser neuen Wert in der Datenbank

Referenzen:

-Borland Delphi 2005 RAD für ADO.NET - das von Bob Swart
-Microsoft ADO NET (Microsoft Press) von David Sceppa
-Verwendung Autoinc Felder mit DataSnap von Dan Miser








Autoinc Werte in der Bdp in Delphi 2005 abrufen


Autoinc Werte in der Bdp in Delphi 2005 abrufen : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


In diesem Artikel werde ich den Begriff zu verwenden-Werte 'Identität' Synonym zu beachten, dass Auto (aus RDMS) erzeugt in der Regel für eine Spalte den Primärschlüssel einer Tabelle darstellt. Diese werden in Oracle und 'Generatoren' in Interbase 'Sequenzen' genannt.
Es gibt 3 Möglichkeiten, um den Identitätswert zurück verwenden ADO NET im allgemeinen:

  1. Verwenden Sie eine Batchabfrage (die Datenbank hat offensichtlich zu unterstützen)
  2. Verwenden Sie eine gespeicherte Prozedur (wie der Einfügen-Befehl) hat als Output-Parameter den Wert des 'Identität' (Dies ist die schnellste und damit empfohlene Methode)
  3. Behandeln des Adapters RowUpdated-Ereignis, /RowUpdating und eine '@@IDENTITY auswählen' (bei SQL Server) Abfrage im Code in diesem Ereignishandler (am langsamsten)

Die ersten beiden Optionen beruhen auf UpdatedRowSource-Eigenschaft des ein Command-Objekt, damit der neue Wert zurück an das DataSet-Objekt weitergegeben wird. Leider wurde diese Eigenschaft nicht derzeit in BdpCommand umgesetzt. Das bedeutet, dass die einzig gangbare Option der 3. ist und ich werde eine Beispielanwendung (für MS SQL Server Northwind-Datenbank) zeigen dies zu bauen:

  • Starten Sie Delphi 2005.
  • Datei zu tun | Neu, und wählen Sie die 'Windows Forms-Anwendung – Delphi für net'-Option.
  • Ziehen Sie aus Data Explorer die Dbo. Employees-Tabelle aus der Datenbank Northwind in MSSQL-Anbieter (Details, wie Sie diese Verbindung können in diesen ausgezeichneten Artikel von Bob Swart gefunden werden). Tabelle 'Employees' verwendet eine AutoInc-Spalte als Primärschlüssel bezeichnet 'EmployeeID'
  • Der BDPDataAdapter erstellt einen Rechtsklick und wählen Sie konfigurieren-Adapter. Dieses holt oben die Datenmaske für die Konfiguration von Adapter für die BdpAdapter-Komponente. Ändern Sie die SELECT-Klausel zu, wie in der folgenden Abbildung dargestellt ist, und klicken Sie auf GenerateSQL:

BdpAdapterConfiguration

  • Klicken Sie auf der Registerkarte und wählen Sie 'Neues Dataset' und klicken Sie auf OK.
  • Festlegen Sie BdpAdapter Active-Eigenschaft auf True.
  • Klicken Sie auf die Tables-Eigenschaft des neu erstellten Datasets ('Dataset1'). Dieses holt oben die Tabellen-Auflistungs-Editor-Eigenschaft für das Dataset. Spalten auswählen und dieses holt oben die Spalten-Editor für die Mitarbeiter-Tabelle. Wählen Sie die Spalte 'EmployeeID', und ändern Sie die folgenden Eigenschaften:
    • AutoIncrement = True
    • AutoIncrementSeed =-1
    • AutoIncrementStep =-1

Wie wird in der folgenden Abbildung gezeigt:

ColumnsCollectionEditor

Hinweis: Da die Werte setzen wir im DataSet ohnehin beim Anwenden eines Updates der Datenbank verworfen werden, konnte jeder Attrappe (einmalig) Wert auch verwendet werden. Es ist jedoch empfehlenswert, festlegen den AutoIncrement-Wert der Spalte darstellt das Primärschlüsselfeld als wahr und machen es einzigartig negative Werte zu nehmen, weil auf diese Weise wir auf Dataseteigenschaften setzen, temporäre eindeutige Werte zu erhalten und darüber hinaus mit negativen Werten als temporäre EmployeeID-Werte sicher stellt, dass kein mit permanente (positive) Datenbank Server zugewiesene Werte Konflikt.

  • Löschen Sie ein DataGrid-Steuerelement auf das Formular, und legen Sie die Datasource-Eigenschaft auf Dataset1 und die DataMember-Eigenschaft auf 'Mitarbeiter'.
  • Löschen einer Schaltfläche, benennen Sie sie als Btnsave_onclick und legen Sie ihren Text auf 'Save Changes'. Doppelklicken Sie auf die Schaltfläche, und geben Sie den folgenden Code:

Prozedur TWinForm1.btnSave_Click (Absender: System.Object; e: System.EventArgs);
beginnen
BdpDataAdapter1.AutoUpdate (DataSet1, 'Employees', BdpUpdateMode.All, ['EmployeeID'],[]);
Ende;

Die 4th-Parameter der AutoUpdate-Methode definiert EmployeeID als lesen einzige Spalte (das heißt, dass es in der letzten INSERT-Klausel nicht berücksichtigt werden) und das ist, was wir eigentlich wollen, da dieser Wert vom Datenbankserver automatisch erzeugt werden.

  • Schließlich, doppelklicken Sie auf das RowUpdated-Ereignis des BdpAdapter und fügen Sie den folgenden Ereignishandler:

Prozedur TWinForm1.BdpDataAdapter1_RowUpdated (Absender: System.Object; e: Borland.Data.Provider.BdpRowUpdatedEventArgs);
var
Cmd:BdpCommand;
beginnen
Wenn (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;
Ende;
Ende;

Zuerst ich feststellen, dass ein Fehler bei der Aktualisierung dieser bestimmten Zeile (UpdateStatus.Continue) nicht gekommen ist und wenn die Zeile gespeichert wurde, war eine eingefügte. In diesem Fall erstelle ich ein BdpCommand-Objekt auswählen und @@IDENTITY-Abfrage ausgegeben. Ich weisen dann den abgerufenen Wert der aktuellen Zeile (e.row) und schließlich rufe ich e.Row.AcceptChanges um die Änderung zu entfernen, habe ich aus dem Änderungsprotokoll.
Beachten Sie, dass wir @@SCOPE_IDENTITY statt @@IDENTITY verwenden soll, für den Fall, dass gab es Audit-Tabellen in der Datenbank durch einige Trigger (wobei @@IDENTITY den Wert eingefügt in die Audit-Tabelle und nicht die 'richtigen' Tabelle, die wir aktualisieren) automatisch aktualisiert.

Führen Sie die Anwendung, und fügen Sie ein paar Zeilen:

Addingrows

Klicken Sie auf 'Änderungen speichern' und die EmployeeID-Werte werden automatisch aktualisiert:

SavedChanges

Ähnliche Techniken (bei der das RowUpdating-Ereignis) konnte verwendet werden, um einen generierten Wert aus einer Interbase-Generator vor dem Anwenden dieser neuen Wert in der Datenbank

Referenzen:

-Borland Delphi 2005 RAD für ADO.NET - das von Bob Swart
-Microsoft ADO NET (Microsoft Press) von David Sceppa
-Verwendung Autoinc Felder mit DataSnap von Dan Miser

Autoinc Werte in der Bdp in Delphi 2005 abrufen

Autoinc Werte in der Bdp in Delphi 2005 abrufen : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Freunden empfehlen
  • gplus
  • pinterest

Kürzliche Posts

Kommentar

Einen Kommentar hinterlassen

Wertung