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.