http://www.hexun.com/
像这种网站,大部分都是 新闻 信息 ,每个 新闻类 调取几条新闻 最新的新闻,
你们是怎么做的,有做过的 给个思路吧。
小弟 是想这么做的,大家看看可不可行
建个 存储过程
Create PROCEDURE [dbo].[PROC_IndexN1List]
 
AS
BEGIN
Create Table #tempTb
(
A1  int ,--新闻ID
A2 int,--类别ID
A3 varchar(500),--标题
A7 int,--排序
A9 datetime --时间
)
insert into #tempTb(A1,A2,A3,A7,A9) select top 1 A1,A2,A3,A7,A9 from TB_N1  where A2=7 insert into #tempTb(A1,A2,A3,A7,A9) select top 1 A1,A2,A3,A7,A9 from TB_N1  where A2=8
..select * from #tempTb
drop table #tempTb
END把我们要的数据加入临时表内,然后一次性读取出来
在写个方法把数据分配到 每个位子

解决方案 »

  1.   

    DataTable dt = new NManage().GetListIndex("").Tables[0];BindIndexData(rptHjbb, dt, 7);//类别一
    BindIndexData(rptBulletin, dt,8);//类别二
    ...
    private void BindIndexData(Repeater rpt, DataTable dt, int strSort)
            {
                DataRow[] drs = dt.Select("A2="+strSort);            DataTable tempTB = dt.Clone();
                for (int i = 0; i < drs.Length; i++)
                {
                    tempTB.Rows.Add(drs[i].ItemArray);
                }
                rpt.DataSource = tempTB;
                rpt.DataBind();
            }
      

  2.   

    首先做一个视图CREATE  view [dbo].[v_NewList] as
    SELECT top 12 id,bid,[sid],kid,title,cast(infor as nvarchar(500)) as infor,url,hits,fbdate,link,Orderid From gl_NewsSystem Where isCheck=1  and sid=1 Order by isTop DESC,OrderID DESC,FBDate DESC,id DESC
    UNION
    SELECT top 5 id,bid,[sid],kid,title,cast(infor as nvarchar(500)) as infor,url,hits,fbdate,link,ORderid From gl_NewsSystem Where isCheck=1  and sid=4 Order by isTop DESC,OrderID DESC,FBDate DESC,id DESC
    UNION
    SELECT top 5 id,bid,[sid],kid,title,cast(infor as nvarchar(500)) as infor,url,hits,fbdate,link,ORderid From gl_NewsSystem Where isCheck=1  and sid=2 Order by isTop DESC,OrderID DESC,FBDate DESC,id DESC
    UNION
    ....
    然后一次性读取视图            DataSet ds = db.GetDataSet("Select * From [v_NewList] ");
                if (ds != null)
                {
                    DataTable dt=ds.Tables[0];
                    rp_01.DataSource = setDataTable(dt.Columns, dt.Select("sid=1","OrderID DESC,FBDate DESC,id DESC"));
                    rp_01.DataBind();
                    rp_02.DataSource = setDataTable(dt.Columns, dt.Select("sid=4", "OrderID DESC,FBDate DESC,id DESC"));
                    rp_02.DataBind();
                    rp_03.DataSource = setDataTable(dt.Columns, dt.Select("sid=2", "OrderID DESC,FBDate DESC,id DESC"));
                    rp_03.DataBind();
                }使用DataTable的Select检索数据并重新排序,使用setDataTable把数据从DataRow[]转换成DataTable    private DataTable setDataTable(DataColumnCollection columns,DataRow[] rows)
        {
            DataTable dt = new DataTable();
            foreach (DataColumn col in columns)
            {
                DataColumn ncol = new DataColumn(col.ColumnName, col.DataType);
                dt.Columns.Add(ncol);
            }
            foreach (DataRow row in rows)
            {
                dt.Rows.Add(row.ItemArray);
            }
            return dt;
        }
      

  3.   

    用Repeater 或者拼接ul 来呈现列表呗简单的就是随机取数据 就 select * from table  order by newid()取最近的 就select * from table order by time desc可以去找几个新闻网 然后看看他们是怎么做的参考
      

  4.   


    因为读取一次数据要比读取N次数据要效率得多,信息类网站的首页通常都是有(十几到几十个RP需要附值),所以效率的做法是先将所有数据读取内存或缓存之中,然后再从中检索出数据,这样可以减少与数据库的交互,从而大大提高访问速度,这个经验总结出来的,也是经过测试认证的
      

  5.   

    LZ 我想问下 你放入临时表是为了解决什么问题,你如果实时想取最新的数据 那你岂不是时刻都要走一次数据库?那你的存储过程是否多余,如果觉得数据库压力大的话 解决数据库的压力的话 那就不是这个方法能解决的   还有 我觉得最好解决数据库压力的话 建议一种  Memcached缓存 他的工作原理就是把你第一次访问的数据读取到服务器内存当中,前台每次只需从服务器内存中获取数据 速度快 压力小  当后台添加了新的数据 只需要删除缓存就可以了 建议楼主使用
      

  6.   


    如果是解决你这样问题的话 建议memcaced  简单实用  很多大型网站都在用 你这种放入临时表也是治标不治本 还是要查询数据库表
      

  7.   

    memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表
    他是以key  object形式存入服务器缓存中的  讲白了就是内存共享  获取数据只需要已key去缓存中查找即可  不用了就已key删除即可  每次只要有新数据的时候,把缓存中的数据替换掉就ok了  可以自己研究 很简单的几步  
      

  8.   

    哎,这种站点都是首页是静态页,可能是定时生成+手动生成2种方式的动态的部分用ajax更新。
    至于数据库,基本是不可能直接查询数据库的,中间都有N级缓存。另一方面,后台还有一个CMS的数据采集系统用于寻找新闻。至于怎么呈现这些信息,循环绑定li就好了,不管你是用Repeater或者是<%for(...)%>都差不多
      

  9.   

    不用先写入临时表
    你全写在存储过程中,通过
    sqldatareader dr = cmd.executeReader()
    然后if(dr.Nextresult())
    进行判断下一条有没有数据,有的话在while(dr.read()){...读取}