首页 新闻 会员 周边

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

0
悬赏园豆:50 [已关闭问题]
<P>在做网站流量统计系统的时候,需要获得<BR> <TABLE style="WIDTH: 1025px" cellSpacing=0 border=0> <TBODY> <TR> <TD>最高日访问量:</TD> <TD><SPAN id=Label10>41</SPAN></TD></TR> <TR> <TD>最高日访问日期:</TD> <TD><SPAN id=Label11>2008-2-18</SPAN></TD></TR> <TR> <TD>最高月访问量:</TD> <TD><SPAN id=Label12>41</SPAN></TD></TR> <TR> <TD>最高月访问月份:</TD> <TD><SPAN id=Label13>2008-2</SPAN></TD></TR> <TR> <TD style="HEIGHT: 20px">最高年访问量:</TD> <TD style="HEIGHT: 20px"><SPAN id=Label14>41</SPAN></TD></TR> <TR> <TD>最高年访问年份:</TD> <TD style="WIDTH: 411px; HEIGHT: 22px"><SPAN id=Label15>2008</SPAN></TD></TR> <TR> <TD style="HEIGHT: 20px">常用浏览器:</TD> <TD style="HEIGHT: 20px"><SPAN id=Label16>IE</SPAN></TD></TR> <TR> <TD style="HEIGHT: 20px">常用操作系统:</TD> <TD style="HEIGHT: 20px"><SPAN id=Label17>WinNT</SPAN></TD></TR></TBODY></TABLE></P>和<BR>本日各时段浏览量表、本周各天浏览量表,本月各天浏览量表,本年各月浏览量表。<BR><BR>虽然这个可以通过建立数组+编程排序等完成,不过我觉得麻烦,而且服务器处理量很大,我想通过SQL语句解决问题,利用语句<BR> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">SELECT</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #ff00ff">year</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #ff00ff">COUNT</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #ff00ff">year</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN style="COLOR: #0000ff">AS</SPAN><SPAN style="COLOR: #000000">&nbsp;countYear<BR><IMG alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">FROM</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info<BR><IMG alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">GROUP</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">BY</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #ff00ff">year</SPAN><SPAN style="COLOR: #000000"><BR><IMG alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">ORDER</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">BY</SPAN><SPAN style="COLOR: #000000">&nbsp;countYear&nbsp;</SPAN><SPAN style="COLOR: #0000ff">DESC</SPAN></DIV>用SqlDataReader读取,其中reader["countYear"
问题补充: http://www.cnblogs.com/lqb/archive/2008/02/18/1072605.html 在做网站流量统计系统的时候,需要获得 最高日访问量: 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用SqlDataReader读取,其中reader["countYear"]就是最高年访问量,reader["year"]就是最高年访问年份。 但是这里就需要有一个year列,在储存日期的时候单独存一个年份列。继续,如果要实现月份,日期,同样也需要添加一个month,date列。当我继续做下去,发现需要实现本日各时段浏览量表、本周各天浏览量表,本月各天浏览量表,本年各月浏览量表时,这种方法行不通了,如果实现需要一个庞大的数据表。 我的一个想法,建立一个临时列,temp,每次获得某种数据前,例如最高年访问量和最高年访问年份,先对数据表中全部temp类的内容改写,然后执行 SELECT id,,temp, COUNT(temp) AS 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+"-"+((DateTim
BlackPhoenix的主页 BlackPhoenix | 初学一级 | 园豆:185
提问于:2008-02-18 18:39
< >
分享
其他回答(4)
0
显示不全啊???
Anders Cui | 园豆:1570 (小虾三级) | 2008-02-18 18:44
0
DataSet是不能执行标准的SQL语句的。 不过它还是具有一定的函数功能。具体你可以参考MSDN的DataTable.Select,有一个Expression 参数。
阿不 | 园豆:665 (小虾三级) | 2008-02-19 13:30
0
DataSet是数据库在本地的一个快照。建立这个快照需要很大的内存和性能损耗。因此,不建议你在DataSet上进行搜索。 还是老老实实写SQL语句,性能和内存都会好很多。 另外,SQL似乎有Year()函数,可以取到一个日期的年份。因此应该写成下面的样子吧: --------------------------- SELECT TOP 1 Year(date) as year, COUNT(year) AS countYear FROM info GROUP BY year ORDER BY countYear DESC -------------------------- 我的SQL不好,也不知道上面的语句是否正确。但是,我相信通过一些SQL优化,可以达到很好的性能和空间效果。
Colin Han | 园豆:3041 (老鸟四级) | 2008-02-19 13:40
0
DataSet 本是支持的查询很少,如果必须的话,需要自己开发 楼主可以试试LINQ化的DataSet试试
G yc {Son of VB.NET} | 园豆:2006 (老鸟四级) | 2008-02-19 15:15
0
方便的方法就是用 linQ
Animax! | 园豆:315 (菜鸟二级) | 2008-02-20 21:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册