这是我学习(在工作中)创建类的方法,使用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());
}
}
答案 0 :(得分:1)
您应该查看一个ORM,例如Entity Framework或NHibernate。
如果由于某种原因这些不适合您的需求,我建议您考虑编写T4 Template,以便生成所需的确切数据访问代码。 T4是Visual Studio中非常强大且未充分利用的工具。
答案 1 :(得分:0)
这是一个典型的模式:
这为您节省了将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