如何在给定DbCommand或DbConnection的情况下创建DbDataAdapter?

Kar*_*rim 20 c# ado.net

我想创建一个适用于任何数据提供者的数据访问层.

我知道可以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评论他的回答...... :)

  • 我只是用Google搜索解决这个问题的方法; 一年之后.我的硬编码案例不处理`SqlCeConnection`和`SqlCeDataAdapter`.由于这是共享代码,我不想强​​迫每个客户端在他们甚至不使用它时安装`SQL Server CE`.感谢您首先找到应该需要的东西! (2认同)

Ser*_*oda 11

DbProviderFactory.CreateDataAdapter*

您还可以通过DbProviderFactories类获取所有已注册的DbProviders .

*我觉得这个方法错了.

  • 给定一个`DbCommand`或`DbConnection`,你如何获得相应的`DbProviderFactory`? (2认同)

Mar*_*ark 5

虽然谢尔盖很好地回答了这个问题,但我花了一点时间才将其翻译成我自己的需要.所以我的理解是,如果你有一个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)