作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 IDbConnection 的实例,它可以是任何连接、Sql、OleDb 等。我想制作一个通用包装器,这样我就可以向包装器发送一个连接并获得一组很好的方法以便于操作。我有一个 Query 方法,我希望它返回一个 DataTable,所以我可以这样做
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();
}
关于c# - 从 IDbConnection 实例实例化 IDataAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10723558/
我有一个 IDbConnection 的实例,它可以是任何连接、Sql、OleDb 等。我想制作一个通用包装器,这样我就可以向包装器发送一个连接并获得一组很好的方法以便于操作。我有一个 Query 方
这个问题在这里已经有了答案: Is datareader quicker than dataset when populating a datatable? (9 个回答) 关闭 10 年前。 我正
我是一名优秀的程序员,十分优秀!