DataAdapter lataa kaikki rivit kerralla ja siksi se kuluttaa enemmän muistia DataReaderiin verrattuna. DataAdapterin etuna on se, että sitä käytettäessä voidaan rivejä käsitellä useaan kertaan, koska ne ovat muistissa tallessa. DataAdapter muodostaa kyselystä tauluja, joten sillä voi suorittaa useamman kyselyn samalla kertaa, jolloin jokaisen kyselyn tulos on omassa taulussaan. Näiden taulujen välille voi muodostaa relaatioita eli yhden taulun sarake voi viitata toisen taulun sarakkeeseen.
public static void HaeTuoteryhmatTuotteineen()
{
// connection string
string connStr = @"Data Source=.\SQLEXPRESS;Initial Catalog=kauppa;Integrated Security=SSPI;";
// kaksi kyselyä kerralla
string query = "SELECT id,nimi FROM tuoteryhma; SELECT id, tuoteryhmaId,nimi FROM Tuote;";
List<Tuoteryhma> tuoteryhmat = new List<Tuoteryhma>();
// luodaan yhteys
using (SqlConnection conn = new SqlConnection(connStr))
{
// luodaan komento
using (SqlCommand cmd = new SqlCommand(query, conn))
{
DataSet set = new DataSet();
// luodaan adapteri
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
// täytetään DataSet
adapter.Fill(set);
// toisen taulun toinen sarake (tuoteryhmaid tuote-taulussa) viittaa
// ensimmäisen taulun ensimmäiseen sarakkeeseen (id tuoteryhma-taulussa)
set.Relations.Add("tuoteryhmän tuotteet",set.Tables[0].Columns[0], set.Tables[1].Columns[1]);
// käydään läpi rivit ensimmäisessa taulussa
foreach (DataRow drTuoteryhma in set.Tables[0].Rows)
{
Tuoteryhma tuoteryhma = new Tuoteryhma();
// sarakkeiseen pääsee käsiksi myös nimellä (indeksin lisäksi)
tuoteryhma.Id = (int)drTuoteryhma["id"];
tuoteryhma.Nimi = (string)drTuoteryhma["nimi"];
// haetaan lapsirivit (eli tuotteet)
foreach (DataRow drTuote in drTuoteryhma.GetChildRows("tuoteryhmän tuotteet"))
{
Tuote tuote = new Tuote();
tuote.Id = (int)drTuote["id"];
tuote.Nimi = (string)drTuote["nimi"];
tuote.Tuoteryhma = tuoteryhma;
tuoteryhma.Tuotteet.Add(tuote);
}
tuoteryhmat.Add(tuoteryhma);
}
}
}
}
}
DataAdapterille ei tarvitse avata yhteyttä erikseen vaan se hoituu automaattisesti.