在建立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 取得資料表名稱