2012-05-23 12 views
13

Herhangi bir bağlantı, Sql, OleDb vb. Olabilen bir IDbConnection örneğim var. Genel bir sarıcı yapmak istiyorum, böylece sarıcıya bir bağlantı gönderebilir ve güzel bir set alabilirim kolay manipülasyon için yöntemler. Bir Sorgu yöntemine sahip , ben bir DataTable dönmek istiyorum, bu yüzdenInstantiate IDataAdapter örneğinden IDbConnection

IDataAdapter adapter = new OleDbDataAdapter(); 
adapter.SelectCommand = myCommand; 
DataSet ds = new DataSet(); 
adapter.Fill(ds); 

Sorun OleDbAdapter kullanmak zorunda olduğunu yapabilir ve SQL için işe yaramaz, gerçekten istemiyorum "sürücüye özgü" kodu yazın. Örneklenmiş IDbConnection nesnesinden bir IDataAdapter örneği alabilmem için bir yol var mı? Ben

IDbCommand command = _connection.CreateCommand(); 

Bir IDataAdapter ile aynı şeyi bazı kolay bir yolu olmalı düşünmek yalnızca mantıklıdır yapan bir komut oluşturabilir biliyorum.

DÜZENLEME:

using (var reader = command.ExecuteReader()) 
{ 
    var dataTable = new DataTable(); 
    dataTable.Load(reader); 
} 

Eh tam olarak ne istedi ama güzel bir çözüm.

+1

çözüldü nasıl. Eğer bu parçanız varsa, çözümü paylaşmak için [DbProviderFactory.CreateDataAdapter] (http://msdn.microsoft.com/en-us/library/system.data.common.dbproviderfactory.createdataadapter.aspx) – mdisibio

+0

+1 kullanabilirsiniz. IDataReader ile. Veri tabanı bağlantılarını, işlemleri vb. Işlemek için kullanılan özel bir çerçeveye sahibiz, ancak Veri Adaptörlerini desteklemiyor (henüz). IDataReader'ı kullanarak, bu çerçeveyi genişletmek/değiştirmek zorunda kalmadan kullanabiliriz. –

+0

Sorunuzu düzenleme özgürlüğünü [okuyucuyu otomatik olarak kapatır] (http://stackoverflow.com/a/2157331/808151) olan 'using' ifadesini eklemek için aldım. –

cevap

7

Bağdaştırıcıyı yansımayı kullanarak nasıl elde edebileceğinizin zor bir örneğidir.

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(); 
} 
4

Aynı problem vardı. Bu bağlantı dizesi Provider özelliği bakmak gerekir Fabrika yöntemleri sahip olacak bir noktada, jenerik ADO.Net kodu yazarken ben o

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; 
    } 
+0

kimliğini kullanarak IDbConnection dbConnection = dbFactory.CreateConnection(); – BlackICE

İlgili konular