sql+mysql+chart+DataTable实现折线图分享!

liangchengfck1 2012-09-21 09:48:22
数据库字段
username number datastar dataend
下面我把我做的完整代码奉上!功能如下
按照姓名求出当年的每个月的,每周的,前一个月的使用流量和用折线图表示出来!

每个月的就是重2012-01-01开始到今天(按照月为单位 yyyy-MM)sum(number)group by 时间就可以了
这里的时间要把 天 时 分 秒 去掉!
因为group by 时间的时候!比如2012-12-12 12:12:12, 2012-12-13 12:13:12
这样分组的话2012-12这天会有不止一条记录,我们要求的是2012-12这月所有的sum!
DATE_FORMAT(datastar , '%Y-%m)my_month
这件话就是把 天 时 分 秒 取掉了 查出来只显示 2012-12 那么我们这个时候在group by 时间 再sum一下就把这一月的和求出来了!

每周的按照周为单位 一共显示2012-01-01到今天的全部周数 求周数的sum放到chart上
前一个月的 按照天数为单位 31条记录(yyyy-MM-dd)
这个功能现在已经完善了!

返回的是databable 如果
DbStatement db = dbc.DbSessionOwa.GetStatement(sql);
return dbc.DbSessionOwa.ExecuteDataTable(db);
这两句话里面的类我没写,反正返回的databable 都知道怎么返回的,所以这两句话你们可以用你们的方法返回datatable!


//每天
public static DataTable SelectDay(string name, string type, string star, string end)
{
string sql = string.Format("SELECT round(sum(size/1000/1024),2)sums,DATE_FORMAT(date, '%Y-%m-%d')my_month from owa_isa where username='{0}' and client='{1}' and date between '{2}' and '{3}' GROUP BY my_month", name,type, star,end);
DbStatement db = dbc.DbSessionOwa.GetStatement(sql);
return dbc.DbSessionOwa.ExecuteDataTable(db);

}
//每周
public static DataTable SelectWeek(string name, string type, string star, string end)
{
string sql = string.Format("SELECT round(sum(size/1000/1024),2)sums,week(date,1)my_month from owa_isa where username='{0}' and client='{1}' and date between '{2}' and '{3}' GROUP BY my_month", name, type, star, end);
DbStatement db = dbc.DbSessionOwa.GetStatement(sql);
return dbc.DbSessionOwa.ExecuteDataTable(db);
}
//每月
public static DataTable SelectMonth(string name, string type, string star, string end)
{
string sql = string.Format("SELECT round(sum(size/1000/1024),2)sums,DATE_FORMAT(date, '%Y-%m')my_month from owa_isa where username='{0}' and client='{1}' and date between '{2}' and '{3}' GROUP BY my_month", name, type, star, end);
DbStatement db = dbc.DbSessionOwa.GetStatement(sql);
return dbc.DbSessionOwa.ExecuteDataTable(db);
}

其实上头让我怎么做的,哎 这要三个方法,其实如果在表示层传sql语句那这个数据访问层也就只要一个方法就行了!上头说表示层不能有sql语句也只能怎么写了!
大家看到就sql语句不一样!其实这个功能就sql语句有含金量!
上面的mqsql数据库
一下是sql数据库的
我就只写sql语句了 方法都同上

日期相关的
得到每周 select sum(使用流量的和),datepart(week,时间字段)as t from Statistical where 1=1 group by datepart

去掉时 分 秒 select时间字段 = convert(varchar(10),时间字段,120) from Statistical

下面是显示页面的代码 业务层我就不写了,直接调用数据访问层也行


OwaManagers owam = apc.GetManager<OwaManagers>();//业务层
DataTable dt = default(DataTable);
load方法(){
string name = Request.QueryString["username"];

string type = Request.QueryString["client"];
DateTime dt = DateTime.Now;
DateTime lastDay = dt.AddDays(-1).Date;//前一天事时间 adddays()里面放的是返回的日期 负往前 正往后
DateTime pre30Day = dt.AddDays(-31).Date;//前一个月时间
DateTime sameDays = dt.AddDays(0).Date;//当天时间
string myear = dt.Year.ToString();//年

string first_day = myear + "-01-01";//年的首月首日
string star = pre30Day.ToString();//开始时间
string end = sameDays.ToString();//当前时间
week(name,type,first_day,end);

}
//每周的
private void week(string name, string type, string star, string end)
{
DataTable dt = NewMethod();

dt = owam.SelectWeek(name,type,star,end); //调用业务层载的方法
//设置图表的数据源
Chart3.DataSource = dt;

//设置图表Y轴对应项

Chart3.Series[0].XValueMember = "my_month";//每周的字段显示在X轴

Chart3.Series[0].YValueMembers = "sums";//每周对应的sum和显示在y轴
Chart3.ChartAreas["ChartArea3"].AxisX.MajorGrid.Interval = 1;
Chart3.ChartAreas["ChartArea3"].AxisX.LabelStyle.Interval = 1;


Chart3.DataBind();
}
有什么疑问可以讨论讨论!这个功能已经完善!
还一个最后的问题 我的周显示的是数字 我要在前面加个W怎么搞!比如 1 2 3 4 5 6周 要显示出W1 W2 W3 ……
...全文
707 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangchengfck1 2012-09-22
  • 打赏
  • 举报
回复
终于完善了!
liangchengfck1 2012-09-22
  • 打赏
  • 举报
回复
fomat 后面跟个“w”+{}就OK了 以前{}里面可以写的是yyyy-MM-dd
不写然后x轴的一个属性改成weeks周就行了!叫什么 i……offitype的!
liangchengfck1 2012-09-21
  • 打赏
  • 举报
回复
业务层我上面没写!
liangchengfck1 2012-09-21
  • 打赏
  • 举报
回复
缩写下上面的代码:
查询的方法
//每周
public static DataTable SelectWeek(string name, string type, string star, string end)
{
string sql = string.Format("SELECT round(sum(size/1000/1024),2)sums,week(date,1)my_month from owa_isa where username='{0}' and client='{1}' and date between '{2}' and '{3}' GROUP BY my_month", name, type, star, end);
DbStatement db = dbc.DbSessionOwa.GetStatement(sql);
return dbc.DbSessionOwa.ExecuteDataTable(db);
}
没用stringbuilder的追加!

//每周的
private void week(string name, string type, string star, string end)
{
DataTable dt = new DataTable();
dt.Columns.Add("my_month");
dt.Columns.Add("sums");
dt = owam.SelectWeek(name,type,star,end); //调用业务层载的方法
//设置图表的数据源
Chart3.DataSource = dt;

//设置图表Y轴对应项

Chart3.Series[0].XValueMember = "my_month";//每周的字段显示在X轴

Chart3.Series[0].YValueMembers = "sums";//每周对应的sum和显示在y轴
Chart3.ChartAreas["ChartArea3"].AxisX.MajorGrid.Interval = 1;
Chart3.ChartAreas["ChartArea3"].AxisX.LabelStyle.Interval = 1;


Chart3.DataBind();
}
用load事件调用week方法
传用到的值!ok!
liangchengfck1 2012-09-21
  • 打赏
  • 举报
回复
/* for (int i = 0; i < dt.Rows.Count; i++)
{
//执行数据操作,取某一条,例如取某一条的第一列数据
string str = dt.Rows[i]["my_month"].ToString();
Chart3.ChartAreas["ChartArea3"].AxisX.LabelStyle.Format = "W"+str;
//数据取出来了,写入数据库就好了
}*/
//流程是这样的 可为什么显示出来的总是最后一条 难道每读出一次x周不加一次数据吗?难不成是最后一次加的!?
这一站_IT 2012-09-21
  • 打赏
  • 举报
回复
还一个最后的问题 我的周显示的是数字 我要在前面加个W怎么搞!比如 1 2 3 4 5 6周 要显示出W1 W2 W3 ……

写个存储过程就OK了,前面加个string "W"
这一站_IT 2012-09-21
  • 打赏
  • 举报
回复
先截图,再保存,最后插入图片O(∩_∩)O哈哈哈~
liangchengfck1 2012-09-21
  • 打赏
  • 举报
回复
不知道怎么截图!知道的高手告诉下,截图的代码看的清楚点!
six-years 2012-09-21
  • 打赏
  • 举报
回复
Rectangle R = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
Image img = new Bitmap(R.Width, R.Height);
Graphics G = Graphics.FromImage(img);
G.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(R.Width, R.Height));
IntPtr dc = G.GetHdc();
G.ReleaseHdc(dc);
G.Dispose();
img .Save("d:\\a.jpg");


截图代码如上 修改point 控制左右上下位置赶紧试试吧

4,818

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧