2014-03-26 38 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