一个良好的设计应该分为业务逻辑层,对象模型层来实现.对象模型层是客户端保持状态使用的,业务逻辑层则是服务器端负责数据处理.对象模型层有类,一个例子如下: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();
}
}
慢慢研究吧^_^
{
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();
}
}
慢慢研究吧^_^
解决方案 »
- VSTO做的Outlook外接程序安装后不能加载!郁闷,请高手指点
- 关于input的问题!!!
- 实现ICollection的 CopyTo,自定义实体泛型类问题
- 急!!!如何过滤webBrowser内容?例如某段javascript使其不在提交时执行?
- 小妹求救!急!DataTable里如何查询有某一列。
- 在线等!如何把480*320的图像利用重采样转换成360*240的图像并显示出来?
- 新手问个简单的问题,怎么把一个字符串 2006-1-1 12:23:00 格式化成2006-01-01的形式?
- 提示操作副丢失???????
- 一个菜鸟的关于变量在同类中通用的问题:<
- SqlConnection、SqlCommand、SqlDataReader这一系列不太好用啊
- FreeTextBox控件的源代码的编译问题?(在线等)
- 简单问题,交作业,分数不限,等待,谢谢!
1.users 与 user是聚合关系,没必要再在users中增加一arraylist,DataTable本身就能够完成此项功能
2.另外所说的业务逻辑层按我的理解应该算是客户端接口层,你的业务逻辑层应该算是User,users,你是如何看的?
3.你的权限是否太简单了?如果较复杂的权限,使你必须增加一个权限类,你会怎么处理?
4.如果要显示所有用户及所拥有的权限(假设你在user中的int right 是权限ID,用你现在的模式,你会怎么处理?
2.另外所说的业务逻辑层按我的理解应该算是数据库访问层(DataAccess),你的业务逻辑层应该算是User,users,你是如何看的?
foreach(user u in users.Items){
....
}
来访问了.而且datatable是按关系模式组织的,arraylist是按对象模式组织的,在这个简单的例子中没有太大区别,但是在有多表参照时就会很不一样了.
至于权限问题我一直使用int就足够了,每一位表示一种权限,可以表示32中权限呢
我与你对分层的理解存在差异。
但如果如果说,在增加用户,验证用户规则,你会在哪一层来实现呢?实际上这个贴子的主题是我问你的4,你会怎么处理。
是保证OO,还是保证效率,
看你系统要求,我现做项目选用前者,
最起码我不想用写和调式烦琐的SQL语句,
记字段名称对我来说也是一个费劲的东西。
增加用户是什么意思啊,用users的add方法不是就可以添加用户了吗,所有更改完成后调用update方法就可以保存到数据库.至于数据一致性,由数据库来保证啊