2012-02-04 42 views
2

我有以下我正用它從Access數據庫讀取大量數據的類。最佳實踐:創建數據訪問類

public class ConnectToAccess 
{ 
    private readonly string _connectionString; 

    public ConnectToAccess(String connectionString) 
    { 
     _connectionString = connectionString; 
    } 

    public List<String> GetData(String sql) 
    { 
     var data = new List<String>(); 
     using (var connection = new OleDbConnection(_connectionString)) 
     { 
      using (var command = connection.CreateCommand()) 
      { 
       command.CommandText = sql; 
       command.CommandType = CommandType.Text; 
       connection.Open(); 
       using (var reader = command.ExecuteReader()) 
       { 
        if (reader != null && reader.HasRows) 
        while (reader.Read()) 
        { 
         data.Add(reader["First Name"] + " " + reader["Last Name"]); 
        } 
       } 
      } 
     } 
     return data; 
    } 
} 

原樣,這個代碼工作,並從數據庫成功拉動數據的採集。但是,我想增強GetData()方法以使其更具動態性。我希望它以某種方式返回一個匿名對象列表,其中每個對象都具有與返回的數據集的列有關的屬性。

我一直在.Net編碼一段時間,但我在許多概念上還是比較新的。我不太清楚如何創建這個最有效地反映數據集中列的匿名對象列表。我也不確定在這種情況下我會使用什麼樣的返回類型,我想也許是List。然後,我想我需要使用反射來將數據從這些匿名對象中提取出來並轉移到需要去的地方。

如果任何人都可以幫助我解決這個難題的任何重要部分,我會非常感激。

+0

爲什麼推倒重來。使用實體框架或其他一些ORM。 – 2012-02-04 05:53:43

+0

@JohnSaunders OP表示他正在使用Access。 EF不支持Access,而僅僅爲了做映射而引入ORM是矯枉過正的。 – Asti 2012-02-04 06:07:17

回答

4

您不能有一個匿名類型作爲返回類型。 爲什麼不只是返回一個DataTable。你甚至可以使用一個DataAdapter來簡化這個過程。它也讓你的架構。

如果你堅持要對象的一切:

public IEnumerable<T> GetData(String sql, Func<DataReader, T> selector) 
{ 
    //code elided 

    while (reader.Read()) 
    { 
     yield return selector(reader); 
    }  
} 

現在你可以選擇使用它:

var people = GetData("Select * from People", reader => new Person { Name = reader{"Name"], Age = reader["Age"] }) 
people.Take(5); //first five records only