Лучшая практика: создание класса доступа к данным - PullRequest
2 голосов
/ 04 февраля 2012

У меня есть следующий класс, который я использую для чтения больших объемов данных из базы данных 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. Тогда я полагаю, что мне нужно было бы использовать отражение, чтобы вытащить данные из этих анонимных объектов и перенести их туда, куда они должны идти.

Если кто-нибудь может помочь мне с какой-либо значительной частью этой головоломки, я был бы очень признателен.

1 Ответ

4 голосов
/ 04 февраля 2012

Вы не можете иметь анонимный тип в качестве возвращаемого типа.Почему бы просто не вернуть 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...