在做网站流量统计系统的时候,需要获得
| 最高日访问量: | 41 |
| 最高日访问日期: | 2008-2-18 |
| 最高月访问量: | 41 |
| 最高月访问月份: | 2008-2 |
| 最高年访问量: | 41 |
| 最高年访问年份: | 2008 |
| 常用浏览器: | IE |
| 常用操作系统: | WinNT |
本日各时段浏览量表、本周各天浏览量表,本月各天浏览量表,本年各月浏览量表。
虽然这个可以通过建立数组+编程排序等完成,不过我觉得麻烦,而且服务器处理量很大,我想通过SQL语句解决问题,利用语句
SELECT year, COUNT(year) AS countYear
FROM info
GROUP BY year
ORDER BY countYear DESC但是这里就需要有一个year列,在储存日期的时候单独存一个年份列。继续,如果要实现月份,日期,同样也需要添加一个month,date列。当我继续做下去,发现需要实现本日各时段浏览量表、本周各天浏览量表,本月各天浏览量表,本年各月浏览量表时,这种方法行不通了,如果实现需要一个庞大的数据表。
我的一个想法,建立一个临时列,temp,每次获得某种数据前,例如最高年访问量和最高年访问年份,先对数据表中全部temp类的内容改写,然后执行
SELECT id,
,temp, COUNT(temp) AS countTemp
FROM info
GROUP BY temp
ORDER BY countTemp DESC
这种也比较好实现,但节约了数据空间而造成了巨大的处理量,每一次访问都需要更改全部内容。
,temp, COUNT(temp) AS countTempFROM info
GROUP BY temp
ORDER BY countTemp DESC
我想通过
dataSet.Tables[0].Columns.Add(new DataColumn("temp", Type.GetType("System.String")));
来添加一列并根据要查询的项修改内容,然后基于内存中的dataSet建立连接执行Sql查询,却不能了,除非将新表数据存在Sql Server中。
string strConn = Profile.PublicConnString;
string strSql = "Select * from info where year is null";
SqlDataAdapter adapter = new SqlDataAdapter(strSql, strConn);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
DataSet ds = new DataSet();
adapter.Fill(ds, "info");
DataTable t0 = ds.Tables["info"];
t0.Columns.Add(new DataColumn("year1", Type.GetType("System.String")));
t0.Columns.Add(new DataColumn("month1", Type.GetType("System.String")));
t0.Columns.Add(new DataColumn("day1", Type.GetType("System.String")));
foreach (DataRow r0 in t0.Rows)
{
r0["year1"] = ((DateTime)r0["come_time"]).Year;
r0["month1"] = ((DateTime)r0["come_time"]).Year+"-"+((DateTime)r0["come_time"]).Month;
r0["day1"] = ((DateTime)r0["come_time"]).Year + "-" + ((DateTime)r0["come_time"]).Month+"-"+((DateTime)r0["come_time"]).Day;
}
adapter.Update(ds, "info");
adapter.Dispose();
string strSql = "Select * from info where year is null";
SqlDataAdapter adapter = new SqlDataAdapter(strSql, strConn);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
DataSet ds = new DataSet();
adapter.Fill(ds, "info");
DataTable t0 = ds.Tables["info"];
t0.Columns.Add(new DataColumn("year1", Type.GetType("System.String")));
t0.Columns.Add(new DataColumn("month1", Type.GetType("System.String")));
t0.Columns.Add(new DataColumn("day1", Type.GetType("System.String")));
foreach (DataRow r0 in t0.Rows)
{
r0["year1"] = ((DateTime)r0["come_time"]).Year;
r0["month1"] = ((DateTime)r0["come_time"]).Year+"-"+((DateTime)r0["come_time"]).Month;
r0["day1"] = ((DateTime)r0["come_time"]).Year + "-" + ((DateTime)r0["come_time"]).Month+"-"+((DateTime)r0["come_time"]).Day;
}
adapter.Update(ds, "info");
adapter.Dispose();
之所以坚持用这种方法,是因为我觉得动态数组+编程排序的处理负荷很大,多用户同时操作时会显得很慢,而如果可以对临时表执行sql查询,当ASP.NET服务器和Sql Server数据服务器在不同的主机上,还可以分担任务,提高性能。
希望大家帮忙想个解决办法或更好的处理想法。
浙公网安备 33010602011771号