我的Windows窗体应用程序中有两个类。
我们说Student
和StudentDetails
,StudentDetails
类也是Student
类的属性。
我有一个存储过程,它从数据库中的两个表中获取数据。 我需要知道这个场景通常是如何处理的,这意味着学生类通常是如何填充的。 非常感谢你的回答。 任何类似情景的链接都会很棒。
这是我的代码:
class Student
{
public int StudentID { get; set; }
public string StudentName { get; set; }
public StudentDetails StudentDetails { get; set; }
public Student()
{
this.StudentID = 0;
this.StudentName = String.Empty;
this.StudentDetails = new StudentDetails();
}
}
class StudentDetails
{
public int StudentDetailsID { get; set; }
public string Address { get; set; }
public int Height { get; set; }
public int Weight { get; set; }
public StudentDetails()
{
this.StudentDetailsID = 0;
this.Address = String.Empty;
this.Height = 0;
this.Weight = 0;
}
}
以下课程有一个填写学生班级的功能( FillStudent())
Class StudentAssembler
{
public List<Model.Student> FillStudent()
{
List<Model.Student> StudentCollection = new List<Model.Student>();
Model.Student StudentDTO = new Model.Student();
try
{
using (Model.dbConnection dbconnection = new Model.dbConnection(Utilities.SqlConnStr))
{
SqlDataReader dr;
SqlCommand command = new SqlCommand("GetStudents", dbconnection.connection);
command.CommandType = CommandType.StoredProcedure;
dbconnection.OpenConn();
dr = command.ExecuteReader();
while (dr.Read())
{
StudentDTO.StudentID = dr[0] == DBNull.Value ? 0 : (int)dr[0];
StudentDTO.StudentName = dr[1] == DBNull.Value ? String.Empty : (String)dr[1];
//this is the part that i need to know how is it usually handled
//StudentDTO.StudentDetails = how to fill out this part ???
StudentCollection.Add(StudentDTO);
}
return StudentCollection;
}
}
catch (Exception)
{
return null;
}
}
}
修改
存储过程代码
select s.StudentID,s.StudentName,sd.StudentDetailsID,sd.Address,
sd.Height,sd.Weight
from Student s,StudentDetails sd
where s.StudentID = sd.StudentID
答案 0 :(得分:1)
考虑存储过程查询,您可以简单地:
StudentDTO.StudentDetails = new StudentDetails
{
StudentDetailsID = dr[2] == DBNull.Value ? 0 : (int)dr[2],
Address = dr[3] == DBNull.Value ? String.Empty : (String)dr[3],
...
};
答案 1 :(得分:0)
你有两个选择
1:一个单独的sproc(或sql),用于通过studentID从学生详细信息表中获取信息。每个学生打电话给
2:加入sproc / sql中的学生详细信息表,并用同一行数据填充
选项1:通常更清洁,更可重复使用。我会说这应该是你的第一个方法。
但是,如果你需要检索很多学生,选项2会快得多。因为它只需要一次调用db。
此外,您似乎在学生和学生之间有一对一的关系,因此没有理由不使用选项2.如果您有一个学生的许多详细信息,您仍然可以使用选项2,跳过重复的学生信息。即使您返回的数据多于sql
所需的数据,这通常也是最好的方法答案 2 :(得分:0)
您可以创建单独的函数来获取学生和学生详细信息记录。 这样,您就可以在代码中的任何位置重复使用这些功能。
E.g。对于student
,你可以拥有这样的功能
public Student CreateStudent(IDataRecord iDataRecord)
{
Student stud = new Student();
stud.Id = GetValue<int>(iDataRecord, "Id");
stud.Name = GetValue<string>(iDataRecord, "Name");
return stud;
}
对于studentDetails
,创建一个这样的函数:
public StudentDetails CreateStudentDetails(IDataRecord iDataRecord)
{
StudentDetails studDetails = new StudentDetails();
studDetails.Id = GetValue<int>(iDataRecord, "Id");
studDetails.Address = GetValue<string>(iDataRecord, "Address");
studDetails.Height = GetValue<string>(iDataRecord, "Height");
studDetails.Weight = GetValue<string>(iDataRecord, "Weight");
return studDetails;
}
然后,在您的FillStudent
方法中,只需致电:
Student student=this.CreateStudent(dr);
student.StudentDetails=this.CreateStudentDetails(dr);
请注意,此代码仅供参考。您可以进一步重新考虑此代码,将其单独创建工厂类。