2014-03-26 30 views
0

我一直在试图制作一个多线图,它从数据库中提取数据。 在努力做到这一点,我写了下面的代码来填充图表:多线图

SqlConnection con1 = new SqlConnection(); 
    con1.ConnectionString = ConfigurationManager.ConnectionStrings["Removed"].ToString(); 
    SqlCommand cmd1 = new SqlCommand("SELECT YEAR(Start_Date) AS Year, Month(Start_Date) As Month, Cost, Utility_Type FROM import_Utilities WHERE YEAR(Start_Date) = 2011 AND Utility_Type = 'Water'"); 
    cmd1.Connection = con1; 
    con1.Open(); 

    SqlDataAdapter da1 = new SqlDataAdapter(cmd1); 
    DataTable dt1 = new DataTable(); 
    da1.Fill(dt1); 
    Chart1.DataSource = dt1; 

    Chart1.Series["Series2"].XValueMember = "Month"; 
    Chart1.Series["Series2"].YValueMembers = "Cost"; 
    Chart1.Legends.Add(new Legend("Default") { Docking = Docking.Right }); 


    Chart1.DataBind(); 
    con1.Close(); 

    SqlConnection con = new SqlConnection(); 
    con.ConnectionString = ConfigurationManager.ConnectionStrings["Removed"].ToString(); 
    con.Open(); 
    SqlCommand cmd = new SqlCommand("SELECT YEAR(Start_Date) AS Year, Month(Start_Date) As Month, Cost, Utility_Type FROM import_Utilities WHERE YEAR(Start_Date) = 2012 AND Utility_Type = 'Water'"); 
    cmd.Connection = con; 
    SqlDataAdapter da = new SqlDataAdapter(cmd); 
    DataTable dt = new DataTable(); 
    da.Fill(dt); 
    Chart1.DataSource = dt; 
    Chart1.Series["2010"].XValueMember = "Month"; 
    Chart1.Series["2010"].YValueMembers = "Cost"; 

    Chart1.DataBind(); 
    con.Close(); 

此代码的工作,除了它有两个数据源,所以只有底部的SqlConnection被填充到图表。 我在失去如何解决这个问题,我想他们是一个更好的方式去做这件事,但我很茫然。

UPDATE:

使用例如波纹管我结束了使用枢轴SQL使一个表(参照图片)。 Pivot Table 然后我更新了我的代码如下所示:

SqlCommand cmd = new SqlCommand("SELECT * FROM (SELECT YEAR(Start_Date), CASE MONTH(Start_Date) WHEN 1 THEN 'January' WHEN 2 THEN 'February' WHEN 3 THEN 'March' WHEN 4 THEN 'April' WHEN 5 THEN 'May' WHEN 6 THEN 'June' WHEN 7 THEN 'July' WHEN 8 THEN 'August' WHEN 9 THEN 'September'WHEN 10 THEN 'October' WHEN 11 THEN 'November' WHEN 12 THEN 'December' END as [Month], [Cost] FROM [HousingAccountingReports].[dbo].[import_Utilities] Where [Building] = 'Building B' AND [Utility_Type] = 'Electric') TableDate PIVOT (SUM([Cost]) FOR [Month] IN ([January],[February],[March],[April],[May],[June],[July],[August],[September],[October],[November],[December])) PivotTable"); 
    cmd.Connection = con; 
    SqlDataAdapter da = new SqlDataAdapter(cmd); 
    DataTable dt = new DataTable(); 
    da.Fill(dt); 
    Chart3.DataSource = dt; 
    Chart3.Series["Series1"].XValueMember = "Month"; 
    Chart3.Series["Series1"].YValueMembers = "2010"; 
    Chart3.Series["Series2"].XValueMember = "Month"; 
    Chart3.Series["Series2"].YValueMembers = "2011"; 
    Chart3.Series["Series3"].XValueMember = "Month"; 
    Chart3.Series["Series3"].YValueMembers = "2012"; 
    Chart3.DataBind();` 

当我运行该页面就错误找不到列一个月。如果我添加:
dt.Columns.Add(“Month”); dt.Columns.Add(“Year”);` 它找不到2010,我如何让我的图表正确驾驶;是他们的问题与我的枢轴sql?

+0

[Separating Chart Series]的可能重复(http://stackoverflow.com/questions/22638639/separating-chart-series) – TylerDurden

回答

1

昨天我回答了类似的问题。 Separating Chart Series

你不能改变一个图表的数据源,而不正在重置的数据,你在上面的代码做的事情。

就像昨天的问题,我会建议你创建一个数据表先在数据表中,然后引用列到你的特殊系列

从昨天的回答

所以,作为一个建议,清理代码,我会做以下

  1. 获取2个数据表
  2. 中号二哥与“月”的数据表作为主键
  3. 每列添加到图表作为新系列

或者你也可以手动绘制系列

因此下降

Chart1.DataSource = dt 
Chart1.Series["2010"].XValueMember = "Month"; 
Chart1.Series["2010"].YValueMembers = "Cost"; 

并将其替换为

For Each row As DataRow In dt1.Rows 
    Chart1.Series("Series2").Points.AddXY(row.Item("Month"), row.Item("Cost")) 
Next 

For Each row As DataRow In dt.Rows 
    Chart1.Series("2010").Points.AddXY(row.Item("Month"), row.Item("Cost")) 
Next 

如果您管理您的所有数据放在一个Datatable,并与创建的,那么你可以根据你的代码做以下

Dim dt As New DataTable 
    dt.Columns.Add("Month", GetType(String)) 
    dt.Columns.Add("2010", GetType(Integer)) 
    dt.Columns.Add("2011", GetType(Integer)) 

    dt.Rows.Add("January", 15, 25) 
    dt.Rows.Add("February", 18, 32) 
    dt.Rows.Add("March", 12, 34) 
    dt.Rows.Add("April", 12, 34) 

    Chart1.DataSource = dt 
    Chart1.Series(0).XValueMember = "Month" 
    Chart1.Series(0).YValueMembers = "2010" 

    Chart1.Series(1).XValueMember = "Month" 
    Chart1.Series(1).YValueMembers = "2011" 

    Chart1.DataBind() 

enter image description here

两个系列的图表这应该工作我的理解:

SqlConnection con = new SqlConnection(); 
     con.ConnectionString = ConfigurationManager.ConnectionStrings["removed"].ToString(); 
     con.Open(); 
     SqlCommand cmd = new SqlCommand("SELECT YEAR(Start_Date) AS Year, Month(Start_Date) As Month, Cost, Utility_Type, Building FROM import_Utilities WHERE YEAR(Start_Date) = 2012 AND YEAR(Start_Date) = 2011 AND Utility_Type = 'Water'"); 

     cmd.Connection = con; 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     DataTable dt = new DataTable(); 
     da.Fill(dt); 

    Chart1.DataSource = dt; 
    Chart1.Series(0).XValueMember = "Month"; 
    Chart1.Series(0).YValueMembers = "2010"; 

    Chart1.Series(1).XValueMember = "Month"; 
    Chart1.Series(1).YValueMembers = "2011" 

    Chart1.DataBind() 

数据表dt应该有所有的数据在它{因为我graving的两年)(我怎样才能将其绑定到一个表,所以我可以确认)

眼下它的抱怨系列不能被用作不过的方法。

我是一个非常新的程序员,只有在我的空闲时间这样做,所以原谅我简单的错误。

我是否需要像设置数据表一样设置数据表: Chart1.DataSource = dt; Chart1.Series(0).XValueMember =“Month”; Chart1.Series(0).XValueMember =“Month”; Chart1.Series(0).YValueMembers =“2010”;

Chart1.Series(1).XValueMember = "Month"; 
    Chart1.Series(1).YValueMembers = "2011" 

    Chart1.DataBind() 

还是这样做的基础上的SQL表?

+0

我可以通过修改其中一个sql命令来获得一个表上的所有信息两年。我怎么会在几年之间有所不同,当我填充系列,如果他们都在一个表中,以便做步骤3 – Itomship

+0

我不为每个语句听懂了没有,但正在寻找像什么,我需要做的,它不是”干净的下降和替换,因为它不工作,如果只是这样做。我是否需要组件参考? – Itomship

+0

看到编辑我添加了一个例子...对于每个语句将循环遍历数据表的每一行,并使用该行中的数据为该系列添加一个点,在绘制之前,您需要在每个系列中使用“chart1.series(0).points.clear”,以确保您删除所有以前的数据 – TylerDurden