Keď používaš DataSet, tak všetky zmeny ulož vždy najprv do DataSetu a až potom do databázy. Pretože ak budeš robiť niektoré zmeny priamo do databázy, tak skôr či neskôr narazíš na situáciu, kedy ti rozdiel medzi databázou a odpojenými dátami v DataSete spôsobí problém, pre ktorý nebude existovať "správne riešenie".
Uloženie zmien v DataSete do databázy sa robí pomocou DbDataAdapteru (pre MS SQL SqlDataAdapter). Na úplne jednoduché veci môžeš použiť DbCommandBuilder (pre MS SQL SqlCommandBuilder), to ale neodporúčam.
Nemusíš vždy ukladať všetky zmeny v DataSete - máš tam aj možnosť uložiť len vybrané riadky. Takže ak by si mal nutkanie spraviť nejakú zmenu priamo do databázy, tak môžeš zmenu zapísať do DataSetu a následne zmenené riadky do databázy. Nenapadá mi síce žiaden praktický príklad, kedy by si to takto chcel robiť, ale dá sa to.
Čo sa týka návrhu tabuliek v databáze, tak je vhodné mať v každej tabuľke stĺpec s verziou riadka (prípadne s časom poslednej úpravy), pomocou ktorého budeš vedieť, či náhodou nedošlo v upravovanom riadku medzitým ku nejakej zmene, o ktorej tvoja aplikácia nevie (optimistické zamykanie) - viď DBConcurrencyException.
Pre tabuľky, ktoré majú stĺpce s automatickým ID (ktoré je od 1 vyššie), si v DataSete nastav AutoIncrement tak, aby AutoIncrementSeed a AutoIncrementStep boli rovné -1. Nové riadky tak budú mať v DataSete záporný identifikátor. Skutočný identifikátor im prideľ až pri zápise do databázy cez adaptér (buď nastav InsertCommand, alebo si vytvor vlastný DataAdapter).
Problémy, na ktoré narazíš pri trochu zložitejších databázových schémach, sú v princípe tri a všetky súvisia s automatickými identifikátormi a cudzími kľúčmi:
1. V DataSete musíš mať nastavené správne cudzie kľúče tak, aby sa ti nový identifikátor po vložení riadka premietol do riadkov, ktoré naň odkazujú cez cudzí kľúč.
2. Zmeny v DataSete musíš ukladať v správnom poradí, pretože nie je možné vložiť riadok, ktorý sa odkazuje na iný ešte nevložený riadok.
3. Musíš počítať s tým, že budeš chcieť vymazať riadok, ktorý sa v databáze vymazal automaticky kvôli kaskádovému mazaniu.
Prvým dvom problémom sa môžeš vyhnuť tak, že po každom vložení/vymazaní riadku uložíš zmeny hneď aj do databázy, čo ale nie je vždy tak celkom možné.
Ako človek, ktorý si s DataSetmi užil svoje, ti radím sa im úplne vyhnúť, pokiaľ nemáš pre ich použitie nejaký pádny dôvod.