DataTable 欄位加總

在建立DataTable時,有時需要至資料庫的資料表中來抓取相關資料,若這時所建立的DataTable有兩張以上

要從這兩張表中抓取某一欄位,並將另一張表的某些數值加入到第一張表中,但不抓取欄位名稱,

並利用 GridView 來做結果的呈現,該如何做?

假設現在在資料庫中有一張資料表,channel,表中有些資料,如下圖所示:

現在我要在 GridView 上顯示頻道(channel)及數量(Total),每一頻道與其相對應的_600K頻道視為同一種類,在 GridView 上所顯示的頻道名稱不要有_600K的頻道部分,

但其所屬的數量(Total)要加至對應的頻道;看起來好像有點複雜,以這兩張表實際舉例的話,就是 頻道 alan=頻道alan_600K,但必須將 頻道alan_600K的數量加至

頻道 alan中,最後在 GridView 中顯示的,是 頻道alan 以及 頻道alan與頻道alan_600K的數量加總。

大致流程為:前端頁面的部份放一 GridView控制項 與 SqlDataSource控制項,兩者不要繫結,因為這兩個控制項是要獨立各自運作的,

在後端程式碼的部分,建立兩個 DataTable,一個為沒有_600K的頻道,一個有_600K的頻道,利用迴圈做篩選,找出我們要的資料結果。

程式碼如下:

//命名空間
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;

...
以下省略


//資料庫連線設定
SqlConnection conn = new SqlConnection
        (ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString);

protected void Page_Load(object sender, EventArgs e)
        {
            conn.Open(); //資料庫連線

            //選取非 _600K 的頻道
            DataTable P = new DataTable();          
            SqlDataAdapter adr = new SqlDataAdapter(@"select Channel ,sum(total) as Total from channel 
            not like '%_600K%' group by channel order by channel", conn);
            adr.Fill(P);

            //選取只有 _600K 的頻道
            DataTable G = new DataTable();
            SqlDataAdapter adr_1 = new SqlDataAdapter(@"select Channel,sum(total) as Total from channel 
            where Channel like '%_600K%'group by channel order by channel", conn);
            adr_1.Fill(G);

            //將頻道的數目加總,無_600K和有_600K的頻道視為同一種,將_600K的頻道扣除,並將其數量加至無_600K的部分
            for (int i = 0; i < P.Rows.Count; i++) //計算第一張表共有幾筆資料
            {
                for (int j = 0; j < G.Rows.Count; j++)//計算第一張表共有幾筆資料
                {
                    string ab = "";
                    ab = (G.Rows[j][0].ToString()).Replace("_600K", "");//將第二張表中_600K字串部分扣除
                    if (P.Rows[i][0].ToString() == ab) //若第二張表中扣除_600K的頻道與第一張表中的頻道相對應的話,則將_600K的頻道數量加至對應的頻道數量
                    {
                        int value = int.Parse(P.Rows[i][1].ToString()) + int.Parse(G.Rows[j][1].ToString());
                        P.Rows[i][1] = value.ToString();
                    }
                }
            }
                conn.Close();

            GridView1.DataSource = P;
            GridView1.DataBind();
            
            
        }

結果如下:

非_600K頻道的名稱,以及數量的加總。

==========================================================================

另外,關於DataTable的一些小概念在上述的迴圈中有使用到,簡單的說明一下:

DataTable.Rows.Count     這是指總共可以看到多少筆資料

DataTable.Columns.Count     這是指可以看到總共有多少欄位

而資料編號是從零開始遞增
DataTable.Rows[資料編號]['欄位名稱']
就可以取出裡面的值

欄位名稱編號也是從零開始遞增
DataTable.Columns[資料編號]   就可以取出欄位名稱

DataTable.TableName    取得資料表名稱