这个DAO方法可以简化吗?

时间:2013-10-21 21:15:01

标签: c# asp.net-mvc-4 visual-studio-2012 coding-style

这是我学习(在工作中)创建类的方法,使用readRecord方法创建数据库访问对象,以便从数据库中获取信息。我很好奇,SF社区的建议是什么缩短它?我可以通过将readRecord代码移动到DAO方法中并在其中更改它来摆脱几行代码,但这仍然存在可能有数百行代码的问题......仅适用于class,以及获取DAO中这些属性的值。

我明白在课堂上没什么可做的(我的意思是,你不能只是自动生成一堆属性...... Visual Studio不知道我要做什么!)但是对于DAO,有没有办法循环遍历类中的所有属性,确定它们的类型,然后获取信息?我厌恶输入数百个“property = dr.GetVariableType(”variablename“);”一遍又一遍!

对不起代码长度......我复制了6次属性,以便了解我在说什么。

namespace MySoftware
{
    public class User
    {
            public int userId { get; set; }
            public string userName { get; set; }
            public string firstName { get; set; }
            public string lastName { get; set; }
            public string MI { get; set; }
            public string suffix { get; set; }
            public string email { get; set; }
            public string phone{ get; set; }
            public string SSN { get; set; }
            public int roleId { get; set; }
            public bool IsTemp { get; set; }
            public int userId { get; set; }
            public string userName { get; set; }
            public string firstName { get; set; }
            public string lastName { get; set; }
            public string MI { get; set; }
            public string suffix { get; set; }
            public string email { get; set; }
            public string phone{ get; set; }
            public string SSN { get; set; }
            public int roleId { get; set; }
            public bool IsTemp { get; set; }
            public int userId { get; set; }
            public string userName { get; set; }
            public string firstName { get; set; }
            public string lastName { get; set; }
            public string MI { get; set; }
            public string suffix { get; set; }
            public string email { get; set; }
            public string phone{ get; set; }
            public string SSN { get; set; }
            public int roleId { get; set; }
            public bool IsTemp { get; set; }
            public int userId { get; set; }
            public string userName { get; set; }
            public string firstName { get; set; }
            public string lastName { get; set; }
            public string MI { get; set; }
            public string suffix { get; set; }
            public string email { get; set; }
            public string phone{ get; set; }
            public string SSN { get; set; }
            public int roleId { get; set; }
            public bool IsTemp { get; set; }
            public int userId { get; set; }
            public string userName { get; set; }
            public string firstName { get; set; }
            public string lastName { get; set; }
            public string MI { get; set; }
            public string suffix { get; set; }
            public string email { get; set; }
            public string phone{ get; set; }
            public string SSN { get; set; }
            public int roleId { get; set; }
            public bool IsTemp { get; set; }
            public int userId { get; set; }
            public string userName { get; set; }
            public string firstName { get; set; }
            public string lastName { get; set; }
            public string MI { get; set; }
            public string suffix { get; set; }
            public string email { get; set; }
            public string phone{ get; set; }
            public string SSN { get; set; }
            public int roleId { get; set; }
            public bool IsTemp { get; set; }
    }
}

DAO

namespace MySoftware
{
        public static List<User> GetUsers(int departmentId)
        {
            List<User> user = new List<User>();

            try
            {
                using (SqlConnection conn = ConnectionHelper.GetConnection("connectionString"))
                {
                    SqlCommand cmd = new SqlCommand("GetUsers", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@DeptId", departmentId);
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        while (dr.Read())
                        {
                            users.Add(readUserRecord(dr));
                        }
                    }

                    return users;
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Failed to get users", ex);
            }
        }
    }

然后我读了记录(这通常位于DAO的底部。

    public static User ReadRegRecord(SqlDataReader dr)
    { 
        User user = new User();

        user.userId = dr.GetInt32("Id");
        user.userName = dr.GetString("UserName");
        user.schoolId = dr.GetInt32("schoolId");
        user.roleId = dr.GetInt32("roleId");
        user.Active = dr.GetBoolean("Active");
        user.IsTemp = dr.GetBoolean("IsTemp ");
        user.firstName = dr.GetString("firstName");
        user.MI = dr.GetString("MI");
        user.lastName = dr.GetString("lastName");
        user.suffix = dr.GetString("Suffix");
        user.email = dr.GetString("email");
        user.Phone = dr.GetString("Phone ");
        user.SSN = dr.GetString("SSN");
        user.userId = dr.GetInt32("Id");
        user.userName = dr.GetString("UserName");
        user.schoolId = dr.GetInt32("schoolId");
        user.roleId = dr.GetInt32("roleId");
        user.Active = dr.GetBoolean("Active");
        user.IsTemp = dr.GetBoolean("IsTemp ");
        user.firstName = dr.GetString("firstName");
        user.MI = dr.GetString("MI");
        user.lastName = dr.GetString("lastName");
        user.suffix = dr.GetString("Suffix");
        user.email = dr.GetString("email");
        user.Phone = dr.GetString("Phone ");
        user.SSN = dr.GetString("SSN");
        user.userId = dr.GetInt32("Id");
        user.userName = dr.GetString("UserName");
        user.schoolId = dr.GetInt32("schoolId");
        user.roleId = dr.GetInt32("roleId");
        user.Active = dr.GetBoolean("Active");
        user.IsTemp = dr.GetBoolean("IsTemp ");
        user.firstName = dr.GetString("firstName");
        user.MI = dr.GetString("MI");
        user.lastName = dr.GetString("lastName");
        user.suffix = dr.GetString("Suffix");
        user.email = dr.GetString("email");
        user.Phone = dr.GetString("Phone ");
        user.SSN = dr.GetString("SSN");
        user.userId = dr.GetInt32("Id");
        user.userName = dr.GetString("UserName");
        user.schoolId = dr.GetInt32("schoolId");
        user.roleId = dr.GetInt32("roleId");
        user.Active = dr.GetBoolean("Active");
        user.IsTemp = dr.GetBoolean("IsTemp ");
        user.firstName = dr.GetString("firstName");
        user.MI = dr.GetString("MI");
        user.lastName = dr.GetString("lastName");
        user.suffix = dr.GetString("Suffix");
        user.email = dr.GetString("email");
        user.Phone = dr.GetString("Phone ");
        user.SSN = dr.GetString("SSN");
        user.userId = dr.GetInt32("Id");
        user.userName = dr.GetString("UserName");
        user.schoolId = dr.GetInt32("schoolId");
        user.roleId = dr.GetInt32("roleId");
        user.Active = dr.GetBoolean("Active");
        user.IsTemp = dr.GetBoolean("IsTemp ");
        user.firstName = dr.GetString("firstName");
        user.MI = dr.GetString("MI");
        user.lastName = dr.GetString("lastName");
        user.suffix = dr.GetString("Suffix");
        user.email = dr.GetString("email");
        user.Phone = dr.GetString("Phone ");
        user.SSN = dr.GetString("SSN");
        user.userId = dr.GetInt32("Id");
        user.userName = dr.GetString("UserName");
        user.schoolId = dr.GetInt32("schoolId");
        user.roleId = dr.GetInt32("roleId");
        user.Active = dr.GetBoolean("Active");
        user.IsTemp = dr.GetBoolean("IsTemp ");
        user.firstName = dr.GetString("firstName");
        user.MI = dr.GetString("MI");
        user.lastName = dr.GetString("lastName");
        user.suffix = dr.GetString("Suffix");
        user.email = dr.GetString("email");
        user.Phone = dr.GetString("Phone ");
        user.SSN = dr.GetString("SSN");
        return user;
    }
}

例如,有没有办法为DAO / readRecord做这样的事情? (我知道这不起作用,但如果有人能想到类似的东西,我很乐意听到它。)

        foreach (var prop in student.GetType().GetProperties())
        {
            if (prop.PropertyType == "String")
            {
                prop.Value = dr.GetString(prop.Name.ToString());
            }
            if (prop.PropertyType == "Int")
            {
                prop.Value = dr.GetInt32(prop.Name.ToString());
            }
        }

4 个答案:

答案 0 :(得分:1)

您应该查看一个ORM,例如Entity FrameworkNHibernate

如果由于某种原因这些不适合您的需求,我建议您考虑编写T4 Template,以便生成所需的确切数据访问代码。 T4是Visual Studio中非常强大且未充分利用的工具。

答案 1 :(得分:0)

这是一个典型的模式:

  1. 使用EF生成映射到现有数据库表的类
  2. 使用Automapper自动映射具有相同名称的属性和/或应用自定义映射逻辑,例如规范化
  3. 这为您节省了将DataReader列映射到实体属性的繁琐代码。

答案 2 :(得分:0)

这对我来说似乎很不错。当然有人可以争辩说,有工具可以从你那里抽象出这项工作,但既然你想要这样做,我就是这样做的。

如果你想要一些可以减轻你负担的东西,你可以使用DapperDotNet或NHibernate / EF来获得更加臃肿的解决方案。

使用Dapper你的DAO看起来像这样:


public static List GetUsers(int departmentId)
{
    try
    {
        using (SqlConnection conn = ConnectionHelper.GetConnection("connectionString"))
        {
            return conn.Query("GetUsers", new { DeptId = departmentId }).ToList();            
        }
    }
    catch (Exception ex)
    {
        throw new Exception("Failed to get users", ex);
    }
}

答案 3 :(得分:0)

试试这个(在我的头顶):

foreach (var prop in typeof(User).GetProperties())
{
    prop.SetValue(student, dr[prop.Name]);
}

假设所有属性的名称都对应于数据读取器中的名称,并且来自数据读取器的任何值都可以强制转换为相应的属性(这是使用ORM的一个很好的理由,正如其他人已经注意到的那样)在答案和评论中)。

您可能还需要检查DBNull值。由于SqlDataReader的{​​{1}}方法只接受列索引的整数而不是列名,因此您必须使用IsDBNull来确定哪个列位置对应于每个名称:

GetOrdinal