最佳实践:创建数据访问类

时间:2012-02-04 05:40:36

标签: c# .net generics reflection ado.net

我有以下类用于从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 个答案:

答案 0 :(得分: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