我按照自己的理解模拟了一个三层结构的布局 不过感觉不对 而且运行起来速度比较慢  请达人帮忙指点一下正确方法 先行谢过表层:public partial class test17 : System.Web.UI.Page
{
    
    public string temp_list1, temp_list2, temp_list3;
    protected void Page_Load(object sender, EventArgs e)
    {        Get_MyData();
    }
    private void Get_MyData()
    {
        this.temp_list1 = GetTestString(netdepth.data.DbHelper.GetDataReader());
        this.temp_list2 = GetTestString(netdepth.data.DbHelper.GetDataReader());
        this.temp_list3 = GetTestString(netdepth.data.DbHelper.GetDataReader());
    }
    private string GetTestString(MySqlDataReader dr)//模拟逻辑层的业务
    {
        string temp_string = null;
        while (dr.Read())
        {            temp_string += dr["z_title"].ToString() + "\n";
            temp_string += "<br/>\n";
        }
        dr.Close();        return temp_string;    }
}数据层:namespace netdepth.data
{
    /// <summary>
    /// 数据访问抽象基础类
    /// 模拟数据层中的事务
    /// </summary>
    public abstract class DbHelper  //将类声明为抽象类 使得类无法被实例化
    {
        private DbHelper() { }
        /// <summary>
        /// 测试获得一个datareader对象
        /// </summary>
        /// <returns></returns>
        public static MySqlDataReader GetDataReader()
        {            MySqlConnection myconnection = new MySqlConnection(netdepth.data.mysqlconnection.GetConnStr1);
            myconnection.Open();
            MySqlCommand mycommand = new MySqlCommand();
            string sql = "select * from test111 order by z_id desc";
            mycommand.Connection = myconnection;
            mycommand.CommandText = sql;
            MySqlDataReader dr;
            dr = mycommand.ExecuteReader(CommandBehavior.CloseConnection);
            
            return dr;
            
        }    }
}

解决方案 »

  1.   

    看了一下,没什么特别的感觉。不过我不太用静态类的。另外.net第一次运行的时候总归有点慢的。第二次就快了。楼主可以试试。
      

  2.   


    谢谢 jyk 你长期qq隐身啊~~~ 呵呵 回头qq见到你 请教一下..
      

  3.   

    你这只有两层UI层和Dal层,标准三层如下:(为简化,我先把注释去掉了)
    1.DAL层:(一般不要使用静态方法,除非经常调用的方法,为方便调用才使用)
    namespace netdepth.data 
    {    
        public class DbHelper 
        { 
            private DbHelper() { }        
            public MySqlDataReader GetDataReader() 
            { 
                MySqlConnection myconnection = new MySqlConnection(netdepth.data.mysqlconnection.GetConnStr1); 
                myconnection.Open(); 
                MySqlCommand mycommand = new MySqlCommand(); 
                string sql = "select * from test111 order by z_id desc"; 
                mycommand.Connection = myconnection; 
                mycommand.CommandText = sql; 
                MySqlDataReader dr; 
                dr = mycommand.ExecuteReader(CommandBehavior.CloseConnection); 
                return dr;             
            } 
        } 
    }
    BLL层:
    namespace netdepth.bll
    {
    public class DbHelper 
         {  
    netdepth.data.DbHelper dh=new netdepth.data.DbHelper();
    public MySqlDataReader GetDataReader() 
             { 
    retur dh.GetDataReader();
    }
    }
    }
    UI层:
    public partial class test17 : System.Web.UI.Page 
    {        netdepth.bll.DbHelper dh=new netdepth.bll.DbHelper();
        string temp_list1, temp_list2, temp_list3; 
        protected void Page_Load(object sender, EventArgs e) 
        { 
            Get_MyData(); 
        } 
        private void Get_MyData() 
        { 
            
            this.temp_list1 = GetTestString(dh.GetDataReader()); 
            this.temp_list2 = GetTestString(dh.GetDataReader()); 
            this.temp_list3 = GetTestString(dh.GetDataReader()); 
        } 
        private string GetTestString(MySqlDataReader dr)//模拟逻辑层的业务 
        { 
            string temp_string = null; 
            while (dr.Read()) 
            { 
                temp_string += dr["z_title"].ToString() + "\n"; 
                temp_string += " <br/>\n"; 
            } 
            dr.Close(); 
            return temp_string; 
        } 

      

  4.   

    我不对你这个是否“三层”问题做评论,我把它当作一个普通程序看待,评一下你的思路:1. 每次回发时读取数据库,这是最常见的设计发臭的代码。我们经常在一个GridView之类的编程中看到在page_Load中给数据绑定控件重新从数据库中绑定的臭代码。我经常请他们试试asp.net2.0中标准的数据源控件,例如sqlDataSource或者ObjectDataSource,注册 Selecting 事件跟踪一下什么时候执行数据库查询,可以看到根本不会在简单的回发时去读取数据库。如果总是读取数据库当然慢。2. asp.net本质上还是基于无状态的Web服务模式的,它使用数据缓存来暂存最必要的数据。缓存设置缓存依赖项,可以在数据表被改变、文件被改变、Cache中某个单元变量被改变,以及很多自定义情况下被刷新。因此,即使需要读取数据库,通常也是首先读取缓存,如果缓存中没有才读取数据库,而缓存依赖项就可以保证缓存中的不会是脏数据。而且,页面缓存、片段缓存要优先于上面所说的数据缓存。因为你开头就提到了“运行起来比较慢”,所以我说了这个可能对你来说要过1年可能才会实际熟练使用的东西。要知道,你从入门书上学到的都是基础的编程方法,那个时候你不能过分纠缠于性能、速度,因为小伎俩根本不是主要的提高性能手段,在入门时只要正常地写出功能就行了。
      

  5.   

    DBHelper那种分层,是彻头彻尾的结构化,而不是我所认可的分层概念。什么是分层呢?例如你学开车,你学会了开某类车的通用技巧,然后当你拿到某个具体的汽车的时候你摸索摸索就会开了,这就是分层。因此数据库中间件是在脱离开你的应用的一个通用工具,你在BLL中方便地使用这个工具,或者例如泛型就可以对具体的类型施加一系列通用操作,或者你写几条代码从通用的代码中继承之后就可以自动地处理你的业务对象,而不需要逐个业务对象去编写数据操作代码,这才是分层。我认识的分层是当业务修改之后你根本无需到你的 DBHelper 中去修改代码,数据库中间件直接自动化地知道自己该怎么正确操作数据库。如果不是这种分层,那么你分层的意思不大。你无需煞有介事地写一个DBHepler,直接在GetTestString中写,或者在旁边写一个方法,把你的DBHelper中的代码跟 GetTestString 代码并排放在一起反倒比较容易维护。
      

  6.   

    有人说:分层之后,如果我换一种数据库,我就可以仅仅修改 DBHepler 中的代码,而不影响 GetTestString 了呀?!哼哼。其实这是借口。如果你一一修改DBHepler中的代码,那么你把它放在GetTestString旁边难道就难以修改了吗?可见这种做法一点也不省力,顶多是把代码转移到另外的文件中,从而看起来匹配了某种对于分层的表面理解了。我并不否认你把类似的代码单独放在一起有他的积极意义(但是其实也是增加了从需求出发查找代码段和进行修改的难度并且造成相互扯皮),但是我要说这其实与真正先进的分层技术相比得不偿失。实际上,如果你把依据某个SQL语句返回DataReader作为一个通用函数库中的函数,要比你这种所谓分层要好。因为那个函数库中的东西与应用程序无关的,不是竖井式的思维。当你需要能够切换数据库的功能,你可以以工厂方式来返回这个函数库,而工厂则自己读取配置文件。并且你可以在BLL层调用资源文件来取得SQL语句(而不是硬编码到源代码中),它所调用的资源文件也是工厂的(读取配置来决定使用不同的资源文件)。总之,你的代码无需分层。学不像分层的时候,暂时不要分层。
      

  7.   

    如果学不像分层(做不出也不喜欢使用通用的数据库中间件),不如退而求其次,仅仅将常用的数据库操作功能独立出来作为通用函数。实际上,ADO.NET对于许多人来说足够简单的,他已经是一个很好工具,它提供可以自动跨多种数据库的操作接口。在BLL中直接使用它就可以了,不要自己用分层这个概念反而添麻烦。如果想要更先进的编程,你可以使用Linq to SQL,或者某种比Linq to SQL更提高你的编程效率的工具,或者花力气自己开发类似工具,而不要自己给自己添麻烦搞你的代码表现的那种所谓的分层。
      

  8.   

    分层架构是为了便于程序的日后频繁的维护和修改,不是为了提高性能。
    你的分层很混乱,简单的说业务逻辑层应该归到数据访问层,然后你再找自己的业务逻辑。
    关与18楼DBHepler本来就是应用结构化的思想的来的,因为访问数据库的方法就那么几个,所以就抽出来写在DBHepler里。
    而要想方便的移植数据库,那应用抽象工厂模式和依赖注入技术很方便实现,也很好用。
      

  9.   

    没听说过,DBHepler分层方法,它好像就是一个数据库访问的辅助类,本来就是应用的结构化的思想的来的。
      

  10.   

    我怎么看起来这么乱啊,三层的代码应该是很简洁的啊。首先是UI调用BLL层,BLL层调用DAL层,然后有一个MODEL层(每层都要引用),其中在DAL层中你可以把所以的关于数据库的操作封装在一个类(DBHelper)中,DAL层中就直接写一个SQL语句或是存储过程直接调用就行了。