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把我们要的数据加入临时表内,然后一次性读取出来
在写个方法把数据分配到 每个位子
像这种网站,大部分都是 新闻 信息 ,每个 新闻类 调取几条新闻 最新的新闻,
你们是怎么做的,有做过的 给个思路吧。
小弟 是想这么做的,大家看看可不可行
建个 存储过程
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把我们要的数据加入临时表内,然后一次性读取出来
在写个方法把数据分配到 每个位子
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();
}
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;
}
因为读取一次数据要比读取N次数据要效率得多,信息类网站的首页通常都是有(十几到几十个RP需要附值),所以效率的做法是先将所有数据读取内存或缓存之中,然后再从中检索出数据,这样可以减少与数据库的交互,从而大大提高访问速度,这个经验总结出来的,也是经过测试认证的
如果是解决你这样问题的话 建议memcaced 简单实用 很多大型网站都在用 你这种放入临时表也是治标不治本 还是要查询数据库表
他是以key object形式存入服务器缓存中的 讲白了就是内存共享 获取数据只需要已key去缓存中查找即可 不用了就已key删除即可 每次只要有新数据的时候,把缓存中的数据替换掉就ok了 可以自己研究 很简单的几步
至于数据库,基本是不可能直接查询数据库的,中间都有N级缓存。另一方面,后台还有一个CMS的数据采集系统用于寻找新闻。至于怎么呈现这些信息,循环绑定li就好了,不管你是用Repeater或者是<%for(...)%>都差不多
你全写在存储过程中,通过
sqldatareader dr = cmd.executeReader()
然后if(dr.Nextresult())
进行判断下一条有没有数据,有的话在while(dr.read()){...读取}