我想创建一个适用于任何数据提供者的数据访问层.
我知道可以DbCommand使用连接上可用的工厂方法创建一个.
objDbCon.CreateCommand();
Run Code Online (Sandbox Code Playgroud)
但是,我找不到任何可以创建的东西DbDataAdapter.这是ADO.NET中的一个错误还是什么?
Joã*_*elo 23
从.NET 4.5开始,在编写与提供程序无关的代码时,您现在可以使用DbProviderFactories.GetFactory接受a 的重载DbConnection来获取正确的提供程序工厂,然后可以从中创建数据适配器.
例:
DbDataAdapter CreateDataAdapter(DbConnection connection)
{
return DbProviderFactories.GetFactory(connection).CreateDataAdapter();
}
Run Code Online (Sandbox Code Playgroud)
似乎有人在ADO.NET团队中读到了Ian Boyd评论他的回答...... :)
Ser*_*oda 11
DbProviderFactory.CreateDataAdapter*
您还可以通过DbProviderFactories类获取所有已注册的DbProviders .
*我觉得这个方法错了.
虽然谢尔盖很好地回答了这个问题,但我花了一点时间才将其翻译成我自己的需要.所以我的理解是,如果你有一个DbConnection,但知道你在底层使用SqlClient,你的代码看起来像:
DbDataAdapter da = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateDataAdapter();
Run Code Online (Sandbox Code Playgroud)
小智 5
private static DbDataAdapter CreateDataAdapter(DbCommand cmd)
{
DbDataAdapter adapter;
/*
* DbProviderFactories.GetFactory(DbConnection connection) seams buggy
* (.NET Framework too old?)
* this is a workaround
*/
string name_space = cmd.Connection.GetType().Namespace;
DbProviderFactory factory = DbProviderFactories.GetFactory(name_space);
adapter = factory.CreateDataAdapter();
adapter.SelectCommand = cmd;
return adapter;
}
Run Code Online (Sandbox Code Playgroud)