Spójrzmy na diagram:
Przedstawiony powyżej diagram przedstawia klasy, wchodzące w skład bezpołączeniowego i połączeniowego modelu.
W tym poście zajmiemy się bezpołączeniowym modelem danych.
DataTable
Obiekt klasy DataTable przedstawia tabelę (np. bazy danych) jako obiekt w pamięci. Obiekt ten przechowuje kolumny jako instancje klasy DataColumn oraz wiersze zawierające dane - DataRow. Tabeli możemy nadać nazwę, co w późniejszym czasie ułatwia jej pobranie z kolekcji tabel.
Każda kolumna przechowywana w DataTable może posiadać dodatkowe ograniczenia związane z rodzajem przechowywanych w niej danych. Dzięki temu, zapewniamy integralność przechowywanych danych.
Niektóre właściwości oraz ich domyślne wartości dla obiektu DataColumn:
- DataType - typ przechowywanych danych - domyślnie string
- MaxLength - maksymalna długość w przypadku łańcuchów tekstowych - domyślnie -1 co oznacza brak sprawdzania tego parametru
- Unique - wartości unikalne - domyślnie false czyli brak kontroli przed wstawianiem duplikatów wartości
- AllowDBNull - wartości DBNull - domyślnie true czyli nie trzeba specyfikować dla danej kolumny wartości
- Caption - tytuł kolumny wykorzystywany np. w kontrolkach graficznych typu DataGridView - domyślnie przyjmuje wartość ColumnName
Code:
Do tabeli możemy także dodać informacje mówiące która kolumna/kolumny tworzą klucz główny (Primary Key) oraz ustawić automatycznie numerowane kolumny. Klucz główny wskazujemy za pomocą właściwości PrimaryKey:
Code:
Auto numerowanie konfigurujemy za pomocą trzech właściwości:
- AutoIncrement - flaga mówiąca czy auto numerowanie jest włączone dla danej kolumny
- AutoIncrementSeed - wartość od której się rozpocznie auto numerowanie
- AutoIncrementStep - krok, o który zwiększy się kolejna wartość w stosunku do poprzedniej
Code:
Nasuwa się pytanie: co się stanie jeżeli w bazie danych także dane pole jest ustawione jako auto numerowane? Otóż wartości automatycznie wyliczane nie są przekazywane do bazy. Baza danych sama wyznaczy kolejne wartości dla pola auto numerowanego. Następnie zostanie uaktualnione pole w obiekcie DataTable wartością pobraną z bazy danych. Istnieje jednak ryzyko: jeżeli nasz DataTable jest numerowany np. od 1 do 50 a w tabeli bazodanowej jest już 10 będziemy mieli do czynienia z następującym scenariuszem:
- do bazy danych zostanie dodany nowy rekord
- baza danych wyznaczy dla niego wartość id = 11
- obiekt DataTable będzie chciał uaktualnić wartość pola kolumny id na 11
- z powodu istnienia w tabeli rekordu z id = 11, zostanie rzucony wyjątek
Dodawać dane do DataTable możemy za pomocą metody Add, która została przeładowana i przyjmuje dane w dwóch postaciach:
- jako obiekt typu DataRow
- jako tablicę wartości dla poszczególnych kolumn - należy wtedy podać wartość dla każdej kolumny
- ImportDataRow - pozwala na import wiersza z zachowaniem jego stanu
- Load - pozwala zaimportować nowe wiersze bądź uaktualnić wartości w istniejących
- LoadDataRow - pozwala wygenerować nowy wiersz na podstawie tablicy wartości dla poszczególnych kolumn
- OverwriteChanges - nadpisuje dane i zmienia stan wiersza na Unchanged; jeżeli zostanie dodany nowy wiersz - także otrzyma stan Unchanged
- PreserveChanges - domyślny tryb - nadpisuje oryginalne dane nowymi, ale nie zmienia wersji wiersza. Nowe wiersze będą w stanie Unchanged
- Upsert - zmienia aktualną wersję, ale nie oryginalną. Nowe wiersze będą mieć stan Added; wiersze ze stanem Unchanged pozostaną w takim stanie jeżeli aktualna wersja jest taka sama jak oryginalna, w przeciwnym wypadku wiersze będą w stanie Modified
Poniżej znajduje się przykład dodawania wierszy do obiektu DataTable za pomocą wcześniej omówionych metod.
Code:
Brak komentarzy:
Prześlij komentarz