DataSet je memorijska predstava podataka, koja uključuje tabele, relacije između tabela i ograničenja. Objekat DataTable se koristi da bi se predstavila tabela u DataSet-u. Konekcija sa bazom podataka nije neophodna da bi se manipulisalo sa podacima u DataSet-u. Podaci u DataSet-u se čuvaju na sličan način kao što se čuvaju u relacionoj bazi podataka. Podaci iz DataSet-a mogu se prikazati u XML formatu.
Klasa DataSet ima Tables svojstvo koje daje koekciju DataTable objekata u DataSet-u. DataSet ima svojstvo Relations koje daje kolekciju objekata DataRelation koji se koriste za opis veza između tabela u DataSet-u. Objekat DataTable ima sledeće kolekcije:
DataSet ds = new DataSet("Northwind"); DataTable dt = new DataTable("MojaTabela"); ds.Tables.Add(dt); |
DataColumn colCustomerID = new DataColumn("CustomerID", typeof(Int32)); |
dt.Colums.Add(colCustomerID); ili DataColumn colCustomerID =dt.Columns.Add("CustomerID", typeof(Int32)); colCustomersID.AllowDBNull = false; colCustomersID.Unique = true; |
Gornji kod prikazuje kreiranje objekta DataSet. Ako se konstruktoru ne prosledi ime DataSet-a onda će mu biti dodeljeno podrazumevano ime NewDataSet. Zatim se instancira DataTable objekat i dodaje u kolekciju Tables DataSet objekta. Kada se prvi put kreira DataTable objekat on nema šemu. Zato se moraju kreirati objekti klase DataColumn i dodati u Columns kolekciju objekta klase DataTable.Objekat. DataColumn se može kreirati pozivom DataColumn konstruktora kao što je to ilustrovano unutar drugog pravougaonika. Drugi način je direktno dodavanje naziva kolone i tipa podataka za kolonu u Columns kolekciju objekta DataTable kao u trećem pravougaoniku. Ako vrednosti NULL nisu dozvoljene za kolonu onda se to specificira korišćenjem svojstva AllowDBNull i njegovim setovanjem na false. Ako želimo da vrednosti u koloni imaju jedinstvene vrednosti onda se to definiše korišćenjem svojstva Unique.
myDataTable.PrimaryKey = new DataColumn[ ] { myDataTable.Columns["CustomerID"] }; |
Constraint pkCustomers = dtCustomers.Constraints.Add ("PK_Customers",dtCustomers.Columns[CustomerID], true); |
Za svaki objekat DataTable koji se nalazi unutar DataSet-a potrebno je definisati primarni ključ. Kada se primarni ključ sastoji samo od jednog atributa tabele radi se o prostom primarnom ključu. Svojstvu PrimaryKey objekta DataTable mora se dodeliti niz objekata klase DataColumn. U slučaju prostog ključa ovaj niz se sastoji samo od jednog člana. Drugi način kreiranja primarno ključa je korišćenje Constraints kolekcije objekta DataTable. Prvi parametar Add metode je naziv ograničenje, drugi parametar je naziv kolone koja predstavlja primarni ključ, a treći parametar mora imati vrednost true da bi se naznačilo da se radi o primarnom ključu.
dtEmployess.PrimaryKey = new DataColumn[ ] { dtEmployess.Colums["LastName"] , dtEmployess.Colums["LastName"] }; |
mojDataSet.Tables["Order Details"].Constraints.Add("PK_OrderDetails", new DataColumn[] { mojDataSet.Tables["Order Details"].Columns["OrderID"], mojDataSet.Tables["Order Details"].Columns["ProductID"] }, true); |
U sledećem kodu prikazano je kreiranje složenog primarnog ključa. Složeni primarni ključ sastoji se od dva ili više atributa tabele nad kojom je definisan. Kreiranje složenog ključa je slično kreiranju prostog primarnog ključa.
public UniqueConstraint( string name, DataColumn[ ] columns, bool isPrimaryKey ); |
public UniqueConstraint( string name, DataColumn column ); |
ds.Tables["Products"].Constraints.Add( new UniqueConstraint ("UC_ProductName", ds.Tables["Products"].Columns["ProductName"]); |
Ovo ograničenje označava da vrednost atributa ili grupe atributa nad kojim je definisano ovo ograničenje mora biti jedinstvena. Kreira se instanciranjem klase UniqueConstraint. U gornjem kodu su prikazana dva konstruktora ove klase. Prvi se može iskoristiti za kreiranje tzv. složenog Unique ograničenja a drugi konstruktor samo za kreiranje prostog Unique ograničenja, tj. ograničenja nad jednim atributom tabele.
public ForeignKeyConstraint( string constraintName, DataColumn parentColumn, DataColumn childColumn ); |
Da bi se u tabeli koja se nalazi unutar DataSet-a kreiralo ograničenje strani ključ DataSet mora imati najmanje dva tabele. Roditeljska tabela mora imati primarni ključ. U kodu je prikazan konstruktor klase ForeignKeyConstraint. Potrebno je definisati naziv ovog ograničenja, kolonu primarnog ključa u roditeljskoj tabeli i kolonu stranog ključa u tabeli potomku.
U sledećim kodovima su data dva načina kreiranja stranog ključa. Prvi je instanciranje klase ForeignKeyConstraint i dodavanje objekta u Constraints kolekciju:
ForeignKeyConstraint mojFK = new ForeignKeyConstraint("FK_Orders_OD", mojDataSet.Tables["Orders"].Columns["OrderID"], mojDataSet.Tables["Order Details"].Columns["OrderID"] ); mojDataSet.Tables["Order Details"].Constraints.Add(mojFK); |
Drugi način je direktno dodavanje stranog ključa korišćenjem metode Add kolekcije Constraint:
mojDataSet.Tables["Order Details"].Constraints.Add( "FK_Pr_OD" ,mojDataSet.Tables["Products"].Columns["ProductID"], mojDataSet.Tables["Order Details"].Columns["ProductID"] ); |
Potrebno je definisati naziv ovog ograničenja, kolonu primarnog ključa u roditeljskoj tabeli i kolonu stranog ključa u tabeli potomku.