In questo articolo useremo il termine "identità" intercambiabilmente notare Auto generato (da RDMS) di solito i valori di una colonna che rappresenta la chiave primaria di una tabella. Questi sono chiamati "sequenze" di Oracle e "generatori" di interbase.
In realtà, ci sono 3 opzioni per ottenere l'identità valore indietro utilizzando ADO. NET in generale:
- Utilizzare un lotto di query (la banca dati, ovviamente, è a sostegno di questa)
- Utilizzare una stored procedure (come il comando Insert) avente come un parametro di output il "Identità" valore (questo è il più veloce e quindi il metodo raccomandato)
- Maneggiare il RowUpdated Adattatore / RowUpdating evento e rilascio di un "SELECT @ @ IDENTITY" (nel caso di SQL Server) nel codice di ricerca in questo gestore di eventi (più lenta)
Le prime due opzioni UpdatedRowSource contare sulla proprietà di un oggetto di comando in modo che il nuovo valore è propagato al DataSet. Purtroppo, questa proprietà non è attualmente stato attuato in bdpCommand. Ciò significa che l'unica soluzione possibile è la 3a e uno I'll costruire una applicazione di esempio (MS contro il database Northwind di SQL Server) che mostra questo:
- Inizio Delphi 2005.
- Do File | Nuovo, e selezionare l'opzione "Applicazione Windows Form - Delphi for. NET" opzione.
- Trascinare i dati da Explorer dbo.Employees tabella nel database Northwind MSSQL fornitore (i dettagli su come impostare questa connessione può essere trovato in questo ottimo articolo da Bob Swart). Tabella Employees utilizza uno AutoInc colonna come chiave primaria denominato "EmployeeID"
- Fai clic destro BDPDataAdapter il creato e selezionare Configura adattatore. In questo modo i dati di configurazione della scheda per la forma bdpAdapter componente. Modificare la clausola SELECT, come mostrato nella figura seguente e fare clic su GenerateSQL:

- Fare clic sulla scheda di dati e selezionare "Nuovo Dataset" e fare clic su OK.
- Impostare la proprietà di Active bdpAdapter Vero.
- Fare clic sulla proprietà di tabelle appena creato Dataset ( "Dataset1"). In questo modo la raccolta di tabelle di proprietà editor per il set di dati. Seleziona colonne e questo porterà l'editor per le colonne della tabella Employees. Selezionare la "EmployeeID" colonna e modificare le proprietà seguenti:
- AutoIncrement = True
- AutoIncrementSeed =- 1
- AutoIncrementStep =- 1
come è mostrato nella seguente figura:

NOTA:Dal momento che i valori che ci sarà nel DataSet verrà eliminato comunque durante l'applicazione degli aggiornamenti al database, poi ogni manichino (unico) il valore potrebbe essere utilizzato come bene. Tuttavia, è una buona pratica per impostare il valore AutoIncrement della colonna che rappresenta la chiave primaria campo come vero e renderlo unico prendere i valori negativi, perché in questo modo ci basiamo su Dataset della proprietà temporanea per ottenere valori unici e in aggiunta utilizzando valori negativi come temporanea EmployeeID valori assicura che non vi è alcun conflitto con permanente (positivi), database server valori assegnati.
- Drop un DataGrid al form e impostare la sua proprietà DataSource di Dataset1 DataMember e le sue proprietà di "lavoratori dipendenti".
- Drop un pulsante, rinominarlo come btnSave e impostare il testo di "Salva modifiche". Fare doppio clic sul pulsante e inserire il seguente codice:
procedura TWinForm1.btnSave_Click (sender: System.Object; e: System.EventArgs);
iniziare
BdpDataAdapter1.AutoUpdate (DataSet1, 'dipendenti', BdpUpdateMode.All, [ 'EmployeeID'],[]);
fine;
Il 4 °parametro del metodo automatico EmployeeID definisce come una colonna di sola lettura (che significa che esso non sarà incluso nel finale clausola INSERT) e questo è ciò che vogliamo davvero, poiché questo valore sarà generata automaticamente dal server di database.
- Infine, fare doppio clic sul RowUpdated caso di bdpAdapter e aggiungere il seguente gestore:
procedura TWinForm1.BdpDataAdapter1_RowUpdated (sender: System.Object; e: Borland.Data.Provider.BdpRowUpdatedEventArgs);
var
Cmd: BdpCommand;
iniziare
Se (e.Status = UpdateStatus.Continue) e
(e.StatementType = StatementType.Insert)
allora
iniziare
Cmd: = BdpCommand.Create ( 'SELECT @ @ IDENTITY', BdpConnection1);
e.Row [ 'EmployeeID']: = Cmd.ExecuteScalar;
e.Row.AcceptChanges;
fine;
fine;
In un primo momento, ho constatato che un errore non è venuto durante l'aggiornamento di questa particolare fila (UpdateStatus.Continue) e se la fila è stato salvato uno inserito uno. In tal caso, creare un oggetto che rilascia la bdpCommand SELECT @ @ IDENTITY query. Ho quindi assegnare il valore recuperato per la riga corrente (e.row) e, infine, mi rivolgo e.Row.AcceptChanges per rimuovere le modifiche che ho fatto il cambio di registro.
Si noti che dobbiamo usare @ @ SCOPE_IDENTITY invece di @ @ IDENTITY nel caso in cui ci sono state le tabelle di controllo nella banca dati aggiornata automaticamente attraverso alcuni trigger (che @ @ IDENTITY il valore inserito nella tabella di audit, e non il "vero" tabella stiamo aggiornando) .
Eseguire l'applicazione e aggiungere un paio di righe:

Fare clic sul pulsante "Salva modifiche" e il EmployeeID valori sono stati aggiornati automaticamente:

Simili tecniche (che coinvolgono il RowUpdating caso) potrebbe essere utilizzata per ottenere un valore generato da un generatore di interbase prima applicazione di questo nuovo valore per la banca dati
Riferimenti:
-- Borland Delphi 2005 RAD per ADO.NET - da Bob Swart
-- Microsoft ADO. NET (Microsoft Press) da David Sceppa
-- Come usare Autoinc campi con DataSnap da Dan Avaro

Delicious
Digg
Google
Yahoo