【问题标题】:Looking for how to create a Generic CreateDataAdapter [duplicate]寻找如何创建通用 CreateDataAdapter [重复]
【发布时间】:2012-05-03 17:26:25
【问题描述】:

创建一个数据集例如

 System.Data.Common.DBConnection conn = getConn();
 DbCommand com = conn.CreateCommand();

 DbDataAdapter da = // get a datadapter from conn ??? There is NO CreateDataAdapter here ?
 da.SelectCommand = com;
 da.Fill(ds);

有什么帮助吗?

更新 - 我知道那里没有 CreateDataAdapter() 方法,正在寻找解决方法!

【问题讨论】:

    标签: c# .net ado.net dataset dataadapter


    【解决方案1】:

    .NET Framework 4.5 中的新功能:GetFactory(DbConnection)

    public static DbDataAdapter CreateDataAdapter(DbConnection connection)
    {
       DbProviderFactory factory = null;
       factory = DbProviderFactories.GetFactory(connection);
    
       if (factory == null)
             throw new ArgumentException("Could not locate factory matching supplied DbConnection", "connection");
    
       return factory.CreateDataAdapter();
    }
    

    另见

    注意:任何代码都会发布到公共领域。无需署名。

    【讨论】:

      【解决方案2】:

      使用反射:

              DbConnection conn = getConn();
              string assemblyName = conn.GetType().Assembly.FullName;
              string typeName = conn.GetType().FullName.Replace("Connection", "DataAdapter"); // You may be more conservative than this
              DbDataAdapter adapter = (DbDataAdapter)Activator.CreateInstance(assemblyName, typeName).Unwrap();
      

      【讨论】:

        【解决方案3】:

        我不确定是否理解正确.. 但也许你想要这样的东西:

         using (System.Data.Common.DBConnection conn = getConn())
         {
          DbCommand com = conn.CreateCommand();
          DbDataAdapter da = CreateAdapter(com);
          // .. properties of adapter ..
          da.Fill(ds);
         }
        

        编辑(未测试):

        您可以像这样创建通用 CreateAdapter 方法(将根据命令类型创建适配器):

        private static DbDataAdapter CreateAdapter<T>(T a_command) where T: DbCommand
        {
             if (a_command is SqlCommand)
             {
                return new SqlDataAdapter();
             }
        
             // .. others adapters..
        
             return null;
        }
        

        【讨论】:

        • 类型也许?? “返回新的 SqlCommand();” Command 或 Connection 上没有 CreateDataAdapter,仅在 ProviderFactory 上!
        • 抱歉应该是“new SqlDataAdapter()”
        【解决方案4】:

        看看here在备注部分下,它说使用DbDataAdapter时需要实现以下构造函数。

        从外观上看,我认为您应该从 DbDataAdapter 继承而不是直接使用它。尝试使用OledbDataAdapter

                OleDbConnection conn = getConn();
                OleDbCommand com = conn.CreateCommand();
        
                OleDbDataAdapter da = new OleDbDataAdapter(comm, conn);
                da.Fill(ds);
        

        【讨论】:

          猜你喜欢
          • 2014-01-27
          • 1970-01-01
          • 2011-10-22
          • 2016-04-15
          • 1970-01-01
          • 2019-08-19
          • 2018-04-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多