Guardando le presentazioni su ADO.NET 2.0, si nota che l'attenzione è quasi esclusivamente accentrata sul DataSet e la DataTable, in pratica il mondo disconnesso.
Ci sono anche delle belle novità per il mondo connesso: SqlDataReader. La prima, per me fondamentale, è la possibilità di avere uno o più data reader aperti sulla stessa connessione. Avete capito bene, potete scrivere qualcosa di questo genere:
SqlConnection connection = new SqlConnection(_connectionString);
try
{
SqlCommand orders = new SqlCommand(
"SELECT OrderID, CustomerID, OrderDate FROM Orders",
connection);
SqlCommand details = new SqlCommand(
"SELECT UnitPrice, Quantity FROM [Order Details] WHERE OrderID = @OrderID",
connection);
details.Parameters.Add("@OrderID", SqlDbType.Int);
connection.Open();
SqlDataReader orderReader = orders.ExecuteReader();
while (orderReader.Read())
{
Console.WriteLine("Order ID {0} - Date {1}", orderReader[0], orderReader[2]);
details.Parameters["@OrderID"].Value = orderReader[0];
SqlDataReader detailReader = details.ExecuteReader();
while (detailReader.Read())
{
Console.WriteLine("\tUnit price {0}\tQuantity {1}",
detailReader[0], detailReader[1]);
}
detailReader.Close();
}
orderReader.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
finally
{
if (connection != null && connection.State == ConnectionState.Open)
connection.Close();
}
Nella versione 1.1 del framework questo non è possibile e si deve optare per l'uso di un DataSet con la relazione oppure creare due connessioni (meglio la prima via!).
Un'altra caretteristica interessante è la paginazione (attenzione, non siamo sicuri che l'avremo ancora nel futuro, l'ambiente dichiara il metodo obsoleto!):
SqlDataReader orderReader = orders.ExecutePageReader(CommandBehavior.Default, 10, 5);
Questo metodo mi restituisce 5 records partendo dal decimo. Ci sono altre novità (forse un pò meno importanti), ma le vedremo un'altra volta, forse ;-)