从IDbConnection实例实例化IDataAdapter

gos*_*iwi 16 c#

我有一个IDbConnection的实例,可以是任何连接,Sql,OleDb等.我想制作一个通用的包装器,所以我可以发送包装器一个连接,并获得一组很好的方法,以便于操作.我有一个Query方法,我希望它返回一个DataTable,所以我可以做

IDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = myCommand;
DataSet ds = new DataSet();
adapter.Fill(ds);
Run Code Online (Sandbox Code Playgroud)

问题是我必须使用OleDbAdapter,它不适用于SQL,我真的不想写"特定于驱动程序"的代码.有没有办法从我的实例化IDbConnection对象中获取IDataAdapter实例?我知道我可以创建一个命令

IDbCommand command = _connection.CreateCommand();
Run Code Online (Sandbox Code Playgroud)

认为必须有一些简单的方法来对IDataAdapter做同样的事情是合乎逻辑的.

编辑:

using (var reader = command.ExecuteReader())
{
    var dataTable = new DataTable();
    dataTable.Load(reader);
}
Run Code Online (Sandbox Code Playgroud)

那不是我要求的,而是一个很好的解决方案.

Tom*_*ers 7

以下是如何使用反射获取适配器的粗略示例.

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();
}
Run Code Online (Sandbox Code Playgroud)