Instantiate IDataAdapter from instance of IDbConnection

c#

Solution

Here is a rough example of how you could get the adapter using reflection.

IDataAdapter GetAdapter(IDbConnection connection) {
    var assembly = connection.GetType().Assembly;
    var @namespace = connection.GetType().Namespace;    

    // Assumes the factory is in the same namespace
    var factoryType = assembly.GetTypes()
                        .Where (x => x.Namespace == @namespace)
                        .Where (x => x.IsSubclassOf(typeof(DbProviderFactory)))
                        .Single();

    // SqlClientFactory and OleDbFactory both have an Instance field.
    var instanceFieldInfo = factoryType.GetField("Instance", BindingFlags.Static | BindingFlags.Public);
    var factory = (DbProviderFactory) instanceFieldInfo.GetValue(null);

    return factory.CreateDataAdapter();
}

Problem

I have an instance of IDbConnection, which can be any connection, Sql, OleDb, etc. I want to make a generic wrapper so I can just send the wrapper a connection and get a nice set of methods for easy manipulation. I have a Query method, I want it to return a DataTable, so I can do ``` IDataAdapter adapter = new OleDbDataAdapter(); adapter.SelectCommand = myCommand; DataSet ds = new DataSet(); adapter.Fill(ds); ``` The problem is I have to use OleDbAdapter and it wouldn't work for SQL, I don't really want to write "driver specific" code. Is there a way I can get a IDataAdapter instance from my instantiated IDbConnection object? I know I can create a command doing ``` IDbCommand command = _connection.CreateCommand(); ``` It's only logical to think there must be some easy way to do the same with an IDataAdapter. EDIT: ``` using (var reader = command.ExecuteReader()) { var dataTable = new DataTable(); dataTable.Load(reader); } ``` Well not exactly what I asked for but a nice solution.

Original source

Related problems