lqb

我一直在努力!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

疑问:如何对内存中DataSet数据表执行Sql语句?

Posted on 2008-02-18 18:12  BlackPhoenix  阅读(1052)  评论(1编辑  收藏  举报

在做网站流量统计系统的时候,需要获得

最高日访问量: 41
最高日访问日期: 2008-2-18
最高月访问量: 41
最高月访问月份: 2008-2
最高年访问量: 41
最高年访问年份: 2008
常用浏览器: IE
常用操作系统: WinNT


本日各时段浏览量表、本周各天浏览量表,本月各天浏览量表,本年各月浏览量表。

虽然这个可以通过建立数组+编程排序等完成,不过我觉得麻烦,而且服务器处理量很大,我想通过SQL语句解决问题,利用语句
SELECT        yearCOUNT(yearAS countYear
FROM            info
GROUP BY year
ORDER BY countYear DESC
用SqlDataReader读取,其中reader["countYear"]就是最高年访问量,reader["year"]就是最高年访问年份。

但是这里就需要有一个year列,在储存日期的时候单独存一个年份列。继续,如果要实现月份,日期,同样也需要添加一个month,date列。当我继续做下去,发现需要实现本日各时段浏览量表、本周各天浏览量表,本月各天浏览量表,本年各月浏览量表时,这种方法行不通了,如果实现需要一个庞大的数据表。

我的一个想法,建立一个临时列,temp,每次获得某种数据前,例如最高年访问量和最高年访问年份,先对数据表中全部temp类的内容改写,然后执行
SELECT id,,tempCOUNT(tempAS countTemp
FROM 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();

之所以坚持用这种方法,是因为我觉得动态数组+编程排序的处理负荷很大,多用户同时操作时会显得很慢,而如果可以对临时表执行sql查询,当ASP.NET服务器和Sql Server数据服务器在不同的主机上,还可以分担任务,提高性能。

希望大家帮忙想个解决办法或更好的处理想法。