NDP - ADO.NET 2.0
Connections

Contents

Connection strings

So far, we have stored connection strings in the app.config file, in the <appSettings> and <connectionStrings> sections:

app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="SqlConnStr" value="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=School"/>
</appSettings>
<connectionStrings>
<add name="OleDbConnStr" connectionString="Provider=SQLOLEDB;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=School"/>
</connectionStrings>
</configuration>

Different lookup procedures are required:

string connStr = ConfigurationManager.AppSettings["SqlConnStr"];

versus

string connStr = ConfigurationManager.ConnectionStrings["OleDbConnStr"].ConnectionString;

Looking up with ConfigurationManager.ConnectionStrings[] gives a ConnectionStringSettings object. Other than the ProviderName and ConnectionString properties, this object is pretty boring.

OLE DB Provider values:

Provider=value Provider
Microsoft.Jet.OLEDB.4.0 OLE DB Provider for SQL Server
SQLOLEDB Microsoft OLE DB Provider for SQL Server
MSDAORA Microsoft OLE DB Provider for Oracle

Using Windows authentication:

Property=value Works for
Integrated Security=true SQL Server
Integrated Security=SSPI SQL Server or OLE DB
Trusted_Connection=yes ODBC only

Here are some majorly over-specified connection strings. These were generated in an earlier version of VS. Later VS generates much smaller strings:

Connection objects

Connection string builders

Connection factories

New in 2.0.

public abstract class DbProviderFactory
{
  public virtual DbCommand CreateCommand();
  public virtual DbCommandBuilder CreateCommandBuilder();
  public virtual DbConnection CreateConnection();
  public virtual DbConnectionStringBuilder CreateConnectionStringBuilder();
  public virtual DbDataAdapter CreateDataAdapter();
  public virtual DbDataSourceEnumerator CreateDataSourceEnumerator();
  public virtual DbParameter CreateParameter();
  public virtual Db Create();
...
}

The following is from the Connected\Connections solution:

app.config

Some line breaks added:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="provider" value="System.Data.SqlClient" />
</appSettings>
<connectionStrings>
<add name ="SqlConnStr"
connectionString = "Data Source=localhost;Initial Catalog=School; Integrated Security=SSPI"/>
</connectionStrings>
</configuration>

Code:

private static void WithConnectionFactory()
{

    string provider = ConfigurationManager.AppSettings["provider"];
    DbProviderFactory factory = DbProviderFactories.GetFactory(provider);

    string connStr = ConfigurationManager.ConnectionStrings["SqlConnStr"].ConnectionString;

    DbConnection conn = factory.CreateConnection();
    conn.ConnectionString = connStr;

    DbCommand cmd = factory.CreateCommand();
    cmd.Connection = conn;
    cmd.CommandText = "select * from Student";

    conn.Open();

    DbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    while (reader.Read())
        Console.WriteLine("{0}\t{1}\t{2}", reader["Id"], reader["FirstName"], reader["LastName"]);

    reader.Close();
}

Note that the value, System.Data.SqlClient, of the provider property is not random. (The property name, provider, however, is arbitrary.) This value must match the invariant attribute of one of the entries in the DbProviderFactories section:

Machine.config (excerpt)

<system.data>
  <DbProviderFactories>
    <add name="SqlClient Data Provider" invariant="System.Data.SqlClient"
         support="FF" description=".Net Framework Data Provider for SqlServer"
         type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.3600.0, 
               Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    ...
  </DbProviderFactories>
</system.data>