It turns out that the week before last, the SQL Server and ADO.NET teams (they may be part of the same team) made public the decision to merge the SqlClient data provider and in-proc SqlServer provider code into a single provider. Details are sketchy currently, but the reasoning behind this is that it's easier for programmers to use a single coding style. You'll be able to distinguish whether you're running in-server by either a bit switch or a connection string parameter. Even though I expressed my preferences to the teams, here's a couple of things I wanted to reiterate.
1. Keep SqlDefinition and SqlExecutionContext for the in-proc provider if at all possible. It's a nice way to optimize execution on the server, even if folks do tend to deduce (incorrectly) that it's related to prepared statements.
2. I've gotten to like SqlCommand's ExecuteSqlScalar method. This currently exists on the SqlServer provider but not on SqlClient. It should exist on both/merge. Here's why:
If I have an aggregate or scalar that can return NULL, it takes something like this code to use this with ExecuteScalar.
// this return NULL if no rows in table
SqlCommand cmd = new SqlCommand(
"select max(id) from test", conn);
Object o = cmd.ExecuteScalar();
if (o.GetType() == typeof(System.DBNull))
i = SqlInt32.Null;
i = new SqlInt32((int)o);
Here's the code using ExecuteSqlScalar in SqlServer provider:
SqlCommand cmd = SqlContext.CreateCommand();
cmd.CommandText = "select min(id) from test";
SqlInt32 i = (SqlInt32)cmd.ExecuteSqlScalar();
Much cleaner, yes?