Preluarea valorilor identificatorului sau a numerelor automate

Cheia primară dintr-o bază de date relațională este o coloană sau o combinație de coloane care conțin întotdeauna valori unice. Dacă cunoașteți valoarea cheii primare, puteți găsi un șir care conține această valoare. RDBMS, cum ar fi SQL Server, Oracle și Microsoft Access / Jet, susțin crearea de coloane cu valori care cresc în mod automat și care pot fi atribuite ca chei primare. Aceste valori sunt generate de server, pe măsură ce rândurile sunt adăugate în tabel. SQL Server definește o proprietate a identificatorului coloanei, Oracle creează o secvență secvență și creează o coloană AutoNumber în Microsoft Access.

Pentru a genera valori în creștere în mod automat, puteți utiliza și obiectul DataColumn. setând proprietatea AutoIncrement la true. Dar acest lucru poate duce la apariția unor valori duplicate în instanțele individuale ale DataTable. în cazul în care valorile crescute în mod automat sunt generate automat în mai multe aplicații client. Folosirea unui server pentru a genera automat creșterea valorilor poate elimina conflictele potențiale, deoarece fiecare utilizator poate primi valorile create de server pentru fiecare linie inserată.

În timpul bazei de date obiect de apel DataAdapter metodă de actualizare poate trimite date înapoi la ADO.NET aplicație ca parametri de ieșire sau ca prima intrare din setul de rezultate returnat de instrucțiunea SELECT, executate în același pachet ca INSERT instrucțiuni. mediu ADO.NET permite obținerea acestor valori, și să actualizeze coloanele relevante din obiectul DataRow în curs de actualizare.

Unele dintre sistemele DBMS, cum ar fi Microsoft Access Jet, nu acceptă parametrii de ieșire și nu pot gestiona mai multe instrucțiuni într-un singur pachet. Lucrul cu motorul bazei de date Jet, o nouă valoare AutoNumber creată pentru rândul introdus poate fi obținută prin rularea unei comenzi SELECT separate în dispozitivul de procesare a evenimentelor RowUpdated al obiectului DataAdapter.

O abordare alternativă în ceea ce privește utilizarea în creștere automat valoarea metodei este de a aplica NewGuid Guid obiect pentru a forma un identificator GUID (identificator unic global) la computer client care pot fi copiate la server atunci când introduce fiecare linie nouă. Metoda NewGuid generează o valoare binară de 16 biți, cu un algoritm, care prevede mare probabilitate ca nici una dintre valorile obținute nu se vor repeta. În baza de date SQL Server, GUID este stocat în coloana unificator identificator. care pot fi create automat în SQL Server folosind funcția NEWID () a limbajului Transact-SQL. Utilizarea unui GUID ca cheie primară poate duce la degradarea performanței. SQL Server oferă suport pentru funcția NEWSEQUENTIALID (). crearea de identificare a valorilor succesive GUID, unic la nivel mondial, care nu este garantată, dar care pot fi indexate mai eficient.

Un scenariu comun este de a apela metoda GetChanges din DataTable pentru a crea o copie care conține numai rândurile modificate, după care această nouă copie este utilizată atunci când este apelată metoda Update a DataAdapter. Acest lucru este util în special dacă doriți să împachetați și să transmiteți rândurile modificate pentru o singură componentă care efectuează actualizarea. După actualizare, această copie poate conține valori noi ale identificatorului, care trebuie apoi să fie transferate în tabela de date originală pentru îmbinare. Iar noile valori ale identificatorului, cu toate probabilitățile, vor fi diferite de valorile inițiale din DataTable. Pentru a efectua această îmbinare, trebuie să păstrați valorile coloanei AutoIncrement originale în copie pentru a putea găsi și actualiza rândurile existente în tabela de date originală. În loc să adăugați noi linii care să conțină noi valori ale identificatorului. Cu toate acestea, în mod implicit, aceste valori inițiale sunt pierdute după ce metoda de actualizare a DataAdapter este apelată. Deoarece metoda AcceptChanges este implicit apelată pentru fiecare DataRow actualizat.

Există două modalități de a stoca valorile originale DataColumn în obiectul DataRow în timpul actualizării DataAdapter.

Primul mod de a stoca valorile originale este setarea proprietății AcceptChangesDuringUpdate a DataAdapter la false. Acest lucru afectează fiecare DataRow din DataTable actualizat. Pentru mai multe informații și un exemplu de cod, consultați AcceptChangesDuringUpdate.

A doua metodă implică utilizarea în tratare a evenimentului RowUpdated DataAdapter cod obiect proprietatea Stare este setată la SkipCurrentRow. Valoarea DataRow este actualizată, dar valoarea inițială a fiecărui obiect este stocat DataColumn. Această metodă vă permite să păstrați valorile inițiale ale unui rând, dar nu celelalte. De exemplu, codul poate fi adăugat pentru a păstra valorile originale ale liniilor, nu modifica sau șterge rânduri verificând StatementType valoarea atribuită valorilor de proprietate urmate Statut SkipCurrentRow numai pentru rândurile cu StatementType proprietăți egale Insert.

Dacă una dintre aceste metode este utilizată pentru a stoca valorile originale în obiectul DataRow în timpul actualizării DataAdapter. apoi în ADO.NET se efectuează un număr de acțiuni pentru a înlocui valorile curente ale DataRow cu valori noi returnate ca parametri de ieșire sau ca primul șir de revenire al setului de rezultate, cu valoarea inițială stocată în fiecare DataColumn. În primul rând, metoda AcceptChanges a obiectului DataRow este chemată pentru a salva valorile curente ca valori inițiale și apoi sunt atribuite valori noi. După aceasta, obiectele DataRows. pentru care este adăugată proprietatea RowState. Valoarea acestei proprietăți RowState este înlocuită cu Modificată. care poate să nu răspundă așteptărilor.

Modul în care rezultatele comenzii sunt aplicate fiecărui obiect DataRow actualizat este determinat de proprietatea UpdatedRowSource a fiecărei comenzi DbCommand. Această proprietate este setată la una dintre valorile din enumerarea UpdateRowSource.

Tabelul următor descrie modul în care valorile enumerării UpdateRowSource afectează proprietatea RowState a rândurilor actualizate.

Această secțiune conține un exemplu care arată modul de obținere a valorilor Autonumber din baza de date Jet 4.0. Motorul bazei de date Jet nu acceptă executarea mai multor instrucțiuni din pachet sau utilizarea parametrilor de ieșire, deci utilizați oricare dintre metodele descrise mai sus pentru a returna o nouă valoare Autonumber. alocate liniei introduse. Cu toate acestea, în instrumentul de procesare a evenimentelor RowUpdated, puteți introduce codul în care se execută o instrucțiune separată SELECT @@ IDENTITY pentru a obține noua valoare Autonumber.

În loc să adăugați informații despre schemă utilizând MissingSchemaAction.AddWithKey în acest exemplu, configurația DataTable este configurată utilizând schema corectă înainte de a apela OleDbDataAdapter pentru a popula DataTable. În acest caz, coloana CategoryID este setată să scadă valoarea din fiecare linie de inserare, pornind de la zero, prin setarea proprietății AutoIncrement la true. proprietatea AutoIncrementSeed de 0 și proprietatea AutoIncrementStep de -1. După aceasta, se adaugă două noi rânduri și se solicită metoda GetChanges pentru a adăuga rândurile modificate la noul tabel DataTable. care este trecut la metoda de actualizare.