2012-02-04 2 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

Зачем изобретать колесо. Используйте Entity Framework или другие ORM. –

+0

@JohnSaunders OP заявляет, что использует Access. EF не поддерживает Access, и бросать в ORM только для того, чтобы сделать картографирование, это избыток. – Asti

ответ

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