非常常见的问题:部门和员工
数据库两个表部门表和员工表,这里只列出部分关键字段部门表:部门编号,部门名称...
员工表:员工编号,员工姓名,所属部门ID...麻烦是业务逻辑层员工对象和数据层员工对象的设计:
//雇员类
class Employee
{
public string empId;//雇员ID
public string empName;//雇员姓名
public string depID;//部门ID
} //部门类
class Department
{
public string depId;//部门ID
public string depName;//部门名
} //数据访问层雇员类
class EmployeeDAC
{
//插入一个雇员
public void AddEmployee(Employee emp)
{
}
//修改一个雇员
public void ModifyEmployee(Employee emp)
{
}
//删除一个雇员
public void DeleteEmployee(Employee emp)
{
}
}困惑的地方:
最终用户在界面上看到的都是有意义的名称,而不是哪些ID和编号,但数据库里和程序里有意义的就是这些ID和编号
比如查看员工信息,显示的总是员工所在部门的名称而不是部门编号,通常的做法就是查询数据库时使用连接,如果使用连接
我一般让这个检索员工信息的方法返回一个Dataset或者ArrayList这只是一个小例子,大部分情况都这复杂,一个数据表有很几个外键,响应的对象很有多ID,显示的时候更麻烦
这种情况该如何设计类呢?
数据库两个表部门表和员工表,这里只列出部分关键字段部门表:部门编号,部门名称...
员工表:员工编号,员工姓名,所属部门ID...麻烦是业务逻辑层员工对象和数据层员工对象的设计:
//雇员类
class Employee
{
public string empId;//雇员ID
public string empName;//雇员姓名
public string depID;//部门ID
} //部门类
class Department
{
public string depId;//部门ID
public string depName;//部门名
} //数据访问层雇员类
class EmployeeDAC
{
//插入一个雇员
public void AddEmployee(Employee emp)
{
}
//修改一个雇员
public void ModifyEmployee(Employee emp)
{
}
//删除一个雇员
public void DeleteEmployee(Employee emp)
{
}
}困惑的地方:
最终用户在界面上看到的都是有意义的名称,而不是哪些ID和编号,但数据库里和程序里有意义的就是这些ID和编号
比如查看员工信息,显示的总是员工所在部门的名称而不是部门编号,通常的做法就是查询数据库时使用连接,如果使用连接
我一般让这个检索员工信息的方法返回一个Dataset或者ArrayList这只是一个小例子,大部分情况都这复杂,一个数据表有很几个外键,响应的对象很有多ID,显示的时候更麻烦
这种情况该如何设计类呢?
解决方案 »
- WCF 获取内网IP
- 如何用Winform做一个识别图片的程序
- 怎样给未知类型的对象赋值???
- 用AxWebBrowser怎么实现这个效果?
- 关于AJAX,欢迎兄弟们讨论?
- .net url重新定向问题
- 初学c#向sql 添加数据 怎么都不成功 望高人指点
- 有没有一种办法取得的俄excel中有多少个workSheets并且每个是什么名字
- 关于DATAGRID的两个问题!!!!
- webbrower html id与name 相同
- 请教,在《Programming C#》里,第一次介绍Dispose method时,示例代码里把它实现了两遍(也就是重载了它),我想问为什么要这样?
- 求助:有没有c#2.0写的C/S结构的代码?想研究一下啊!
{
public string empId;//雇员ID
public string empName;//雇员姓名
public string depID;//部门ID
} 变成
class Employee
{
public string empId;//雇员ID
public string empName;//雇员姓名
public Department department ;//部门
}
把每个外键都建成相应的实体类,这样就使保存的时候比较麻烦,但查询的时候和方便
如果是一对多的就建立一个对象集合ArrayList
具体要分清业务逻辑,是一对多,还是一对一,还是多对多
就象xh831213 那样设计,那创建employee对象的时候也要创建一个部门对象了
总之要么查询麻烦,要么更新麻烦,要么显示麻烦
还有别的解决方案吗?
{
public string empId;//雇员ID
public string empName;//雇员姓名
public string depID;//部门ID
} 变成
class Employee
{
public string empId;//雇员ID
public string empName;//雇员姓名
public Department department ;//部门
{
get
{
return 根据depID返回的department
}
}
public string depID;//部门ID
}
这样可以么?
---------
这个问题确实不是什么难题,这么多软件也做 了过来.
总是想知道是否有更好解决办法?
class Employee
{
public string empId;//雇员ID
public string empName;//雇员姓名
public string depID;//部门ID
} 变成
class Employee
{
public string empId;//雇员ID
public string empName;//雇员姓名
public Department department ;//部门
}
或者变成
class Employee
{
public string empId;//雇员ID
public string empName;//雇员姓名
public string depID;//部门ID
public string depName;//部门名称
} 用户显示的时返回两表关联数据视图(包含有部门名称),而插入时,可以传递ID(插入前转换,但这种方法不适合应用大量数量,如销售单中的货品ID转换,如果大量的转换让程序与数据库之间来回,除性能以外,速也是个问题),也可以传递名称或编码(如货品编码,更新时转换,将所传入的编码集作为条件,返回ID集,再更新所有的ID,即一次性转换,适合大量的数据),另一个就是在界面转换,即在控件或单元格中利用录入时或选择时进行转换,可以利用控件或单元格的Tag属性保存,但这种就需要在界面有严格的控制,否则可能对应ID会出错.还有一种就是利用存储过程来在后台更新和转换.
以上仅是个人应用的方法. 不知各位还有什么其他办法
{
public string empId;
public string empName;
public string empDeptId;
}
class Department
{
public List<Employee> Employees = new List<Employee>();
public string DepartmentID;
public string DepartmentName;
public string DepartmentPid; public void AddEmployee(Employee emp)
{
emp.empDeptId = this.DepartmentID;
Employees.Add(emp);
//...操作数据库
}
public void EditEmployee(Employee emp)
{....}
public void DelEmployee(string empId)
{....}}