一个良好的设计应该分为业务逻辑层,对象模型层来实现.对象模型层是客户端保持状态使用的,业务逻辑层则是服务器端负责数据处理.对象模型层有类,一个例子如下:public class User
{
protected DataRow _InnerRow;
public DataRow InnerRow {
get {
return _InnerRow;
              }
}
public String UID{
get{
if(!Global.IsDBNull(_InnerRow["UserID"]))
return _InnerRow["UserID"].ToString();
else throw(new System.Exception("没有关联的用户!"));
}
}
public String PSW{
get{
if(!Global.IsDBNull(_InnerRow["User_Password"]))
return _InnerRow["User_Password"].ToString();
else throw(new System.Exception("用户密码设置不能为空!"));
}
}
public int Right{
get{
if(!Global.IsDBNull(_InnerRow["User_Right"]))
return (int)_InnerRow["User_Right"];
else throw(new System.Exception("用户权限设置不能为空!"));
}
}
public void SetPower(int right){
_InnerRow["User_Right"]=right;
}
public void SetPWD(String psw){
_InnerRow["User_Password"]=psw;
}
public User(DataRow dtr) {
_InnerRow=dtr;
}
}
}
public class Users
{
protected DataTable _InnerTable;
protected ArrayList _Items;
public ArrayList items {
get{
return _Items;
}
}
public Users(DataTable t){
_InnerTable=t;
_Items=new ArrayList();
DataRow dtr;
for(int i=0;i<_InnerTable.Rows.Count;i++){
dtr=_InnerTable.Rows[i];
_Items.Add(new User(dtr));
}
}
public User Add(String uid,String psw,int right) {
DataRow dtr=_InnerTable.NewRow();
dtr["UserID"]=uid;
dtr["User_Password"]=psw;
dtr["User_Right"]=right;
User user=new User(dtr);
_InnerTable.Rows.Add(user.InnerRow);
_Items.Add(user);
return user;
}
public void Remove(String UID){
if(_Items==null)return;
foreach(User _user in _Items){
if(_user.UID==UID){
_Items.Remove(_user);
_user.InnerRow.Delete();
return;
}
}
}
public void Update(){
BusinessTierProxy.Remote.User_Update(ref _InnerTable);
}
public bool Contain(String UID,out int index){
index=-1;
if(_Items==null)return false;
foreach(User u in _Items){
index++;
if(u.UID.ToUpper()==UID.ToUpper())return true;
}
return false;
}
static public void GetAllUsers(out Users users){
DataTable dataTable;
BusinessTierProxy.Remote.User_GetALL(out dataTable);
users=new Users(dataTable);
}
}
}
业务逻辑层:
public void User_GetALL(out DataTable dataTable)
{
DataTier.Instance.GetTable("SELECT * from njp_user",out dataTable);
}
public void User_Update(ref DataTable dataTable)
{
DataTier.Instance.UpdateDBFromTable("SELECT * from njp_user",ref dataTable);
}
数据服务层:
public void GetTable(String SqlCmd,out DataTable dataTable){
SqlConnection sqlConn=new SqlConnection(GetConnStr());
SqlDataAdapter sqlDataAdapter=new SqlDataAdapter(SqlCmd,sqlConn);
dataTable=new DataTable();
try{
sqlConn.Open();
sqlDataAdapter.Fill(dataTable); }
catch(System.Exception ex){
throw ex;
}
finally{
sqlConn.Close();
}
}
public void UpdateDBFromTable(String cmdString,ref DataTable dataTable){
SqlConnection sqlConn=new SqlConnection(connString);
SqlDataAdapter sqlDataAdapter;
SqlCommandBuilder cmdBuilder;
SqlTransaction tran=null;
SqlCommand cmd;
try{
sqlConn.Open();
tran=sqlConn.BeginTransaction();
cmd=new SqlCommand(cmdString,sqlConn);
sqlDataAdapter=new SqlDataAdapter(cmd);
cmdBuilder=new SqlCommandBuilder(sqlDataAdapter);
cmd.Transaction=tran;
DataTable dtAdded=dataTable.GetChanges(DataRowState.Added);
if(dtAdded!=null)sqlDataAdapter.Update(dtAdded);
DataTable dtModified=dataTable.GetChanges(DataRowState.Modified);
if(dtModified!=null)sqlDataAdapter.Update(dtModified);
DataTable dtDeleted=dataTable.GetChanges(DataRowState.Deleted);
if(dtDeleted!=null)sqlDataAdapter.Update(dtDeleted);
tran.Commit();
}
catch(System.Exception ex){
tran.Rollback();
throw ex;
}
finally{
sqlConn.Close();
}
}
慢慢研究吧^_^

解决方案 »

  1.   

    oo与数据裤并不矛盾,在面向对象/面向组件的多层系统开发中,要进行oo抽象的只是对象模型层.业务逻辑层只是有无状态的方法组成的.数据库的完整和一致只是由数据库负责.因此整个工作模式为"业务逻辑层执行sql语句"--->"对象模型层使用无连接数据集实例话对象"--->"界面使用对象显示数据",也就是说对象模型层起到了将数据库的关系模式(包括多表参照等)转换为对象模式(参照转换为对象聚合).用户在界面上的输入保存在对象模型层中(实际上是对象模型层缓存的无连接数据集中).然后无连接数据集被提交到业务逻辑层更新数据库,这是比较现实/完美的解决方法
      

  2.   

    楼上的,多谢了。你的代码看了,多谢,有以下意见:
    1.users 与 user是聚合关系,没必要再在users中增加一arraylist,DataTable本身就能够完成此项功能
    2.另外所说的业务逻辑层按我的理解应该算是客户端接口层,你的业务逻辑层应该算是User,users,你是如何看的?
    3.你的权限是否太简单了?如果较复杂的权限,使你必须增加一个权限类,你会怎么处理?
    4.如果要显示所有用户及所拥有的权限(假设你在user中的int right 是权限ID,用你现在的模式,你会怎么处理?
      

  3.   

    sorry,wincarf(努力穿裤裤),2应更改为:
    2.另外所说的业务逻辑层按我的理解应该算是数据库访问层(DataAccess),你的业务逻辑层应该算是User,users,你是如何看的?
      

  4.   

    不对,Datatable是缓存的无连接数据集,用于提高效率,否则更新时需要使用Arraylist来重新构造dataset.而ArrayList则是user对象集合,提供给界面访问的界面上就可以使用
    foreach(user u in users.Items){
    ....
    }
    来访问了.而且datatable是按关系模式组织的,arraylist是按对象模式组织的,在这个简单的例子中没有太大区别,但是在有多表参照时就会很不一样了.
      

  5.   

    user和users是对象模型层的,不是业务逻辑层,数据访问层是重业务逻辑层独立出来的.在ado.net中无连接数据集的出现使得设计独立的数据服务层很有必要.
    至于权限问题我一直使用int就足够了,每一位表示一种权限,可以表示32中权限呢
      

  6.   

    你在users中实现IEnumerable,IEnumerator接口,效果于ArrayList一样的,而且可避免ArrayList于DataTable中保存两份相同的数据.
    我与你对分层的理解存在差异。
    但如果如果说,在增加用户,验证用户规则,你会在哪一层来实现呢?实际上这个贴子的主题是我问你的4,你会怎么处理。
      

  7.   

    方便往往导致效率上的问题,
    是保证OO,还是保证效率,
    看你系统要求,我现做项目选用前者,
    最起码我不想用写和调式烦琐的SQL语句,
    记字段名称对我来说也是一个费劲的东西。
      

  8.   

    arraylist中并没有保存和datatable不同的数据,因为arraylist中的user对象是用datatable的datarow来实例化的,实际上只是其映射而已.
    增加用户是什么意思啊,用users的add方法不是就可以添加用户了吗,所有更改完成后调用update方法就可以保存到数据库.至于数据一致性,由数据库来保证啊
      

  9.   

    明白你问什么了,如果right是id的话,还要在建一个right类,初始化user类时使用rid初始话right对象.当用户使用user.right访问right对象时,right对象lazy初始化,通过业务逻辑层访问数据库,取出对应的值来初始化自己的属性入rightname.这就是我说的对象模型层将数据库关系模式转化为对象聚合模式的意思