从 IDbConnection 实例实例化 IDataAdapter
本文关键字:IDataAdapter 实例化 实例 IDbConnection | 更新日期: 2023-09-27 18:35:03
我有一个IDbConnection的实例,它可以是任何连接,Sql,OleDb等。我想制作一个通用包装器,这样我就可以向包装器发送一个连接并获得一组易于操作的好方法。我有一个查询方法,我希望它返回一个数据表,所以我可以
IDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = myCommand;
DataSet ds = new DataSet();
adapter.Fill(ds);
问题是我必须使用 OleDbAdapter 并且它不适用于 SQL,我真的不想编写"特定于驱动程序"的代码。有没有办法从我的实例化 IDbConnection 对象中获取 IDataAdapter 实例?我知道我可以创建一个命令
IDbCommand command = _connection.CreateCommand();
认为必须有一些简单的方法来使用 IDataAdapter 做同样的事情是合乎逻辑的。
编辑:
using (var reader = command.ExecuteReader())
{
var dataTable = new DataTable();
dataTable.Load(reader);
}
好吧,不完全是我要求的,但是一个不错的解决方案。
下面是如何使用反射获取适配器的粗略示例。
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();
}
我遇到了同样的问题。这就是我解决它的方式
private DataSet executeDataQuery(string query, string connection, string provider, out Exception ex) {
DataSet ds = new DataSet();
ex = null;
DbProviderFactory dbFactory = DbProviderFactories.GetFactory(provider);
IDbConnection dbConnection = dbFactory.CreateConnection();
dbConnection.ConnectionString = connection;
using (dbConnection) {
try {
IDbDataAdapter dbAdapter = dbFactory.CreateDataAdapter();
IDbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.CommandText = query;
dbCommand.CommandType = CommandType.Text;
dbAdapter.SelectCommand = dbCommand;
dbAdapter.Fill(ds);
}
catch (Exception exc) {
ex = exc;
}
finally {
if (dbConnection.State == ConnectionState.Open) {
dbConnection.Close();
}
}
}
return ds;
}