2015年9月8日 星期二

【C#】Datatable使用For和Foreach讀取每筆資料對照寫法

原本從DataTable取值,都習慣使用for迴圈,不過,後來嘗試到foreach的好用之後,漸漸習慣用foreach來玩各種變化型,尤其用在客制化report上,頗好用。


1.for
for (int i = 0; i < dt.Rows.Count; i++)
{
    data.pa_pc_data[i].s = dt.Rows[i]["s"].ToString();
    data.pa_pc_data[i].ss = dt.Rows[i]["ss"].ToString();  
    data.pa_pc_data[i].Name = dt.Rows[i]["Name"].ToString();
}

2.foreach 一般不需做太特殊的處理時,可以這樣取值即可
foreach (DataRow dr in dt.Rows)
{
    data.pa_pc_data[idx].s = dr["s"].ToString();
    data.pa_pc_data[idx].ss = dr["ss"].ToString();
    data.pa_pc_data[idx].Name = dr["Name"].ToString();
}

3.foreach 通常這種用法,大多用在需要取得欄位名稱的時候
foreach (DataRow dr in dt.Rows)
{
    foreach (DataColumn dc in dt.Columns)
    {
        foreach (char na in dc.ColumnName)
        {
            Console.Write(na);
        }
        Console.Write(string.Format("{0}[{1}]: {2}", dc.ColumnName, dt.Rows.IndexOf(dr), dr[dc].ToString()));
        data.pa_pc_data[dt.Rows.IndexOf(dr)].s = dr[dc].ToString();
    }
}

一般大部份時候的取值,我還是用2的作法而已,不過,之前幫以前的公司寫一支ap去跑排程郵件通知時,懶病發作,所以,就運用的3的方式來玩。

在公司舊有的運行方式裡,一張表單就有一個專屬的ap在做每日的排程郵件發送,然,公司怎麼可能只有一兩支這種ap呢?每個ap的顯示樣式都不一樣,而且,都是程式一筆一劃去用html把表格搞出來,幾十幾百支這樣的ap,只要全部都需要改表格樣式,我就死定了,只有哭哭的份。T^T

於是,力排眾議兼跟主管拍桌子,最後寫出了一支整合ap,把所有的排程郵件ap全部整合成一支,其中表格的部份,就是用3的方式去跑迴圈,把表格搞出來,管你是SQL Server還是Oracle還是哪一家,在工具裡跑語法跑出來的表格長怎樣,迴圈畫出來的Html表格就是長怎樣,至於語法則一律用Stored Procedure,在SP裡Create一個Temptable,欄位名稱都是用中文的,然後,再把資料填到Temptable裡,最後輸出這個Temptable,這樣ap裡就不需要去定義任何表單的欄位中文名稱了,管你名稱是什麼鬼,一律把Temptable轉成Html表格就好了,欄位名稱有錯,就是SP的問題,直接調整SP裡的Temptable即可。

任何異動就是調整SP裡的Temptable的長相,讓事情單純一點,不必每次都必須為了小異動,又要重新compiler程式,一重新compiler程式,以林祖媽的龜毛,就有一堆表單都要測過,確保不會有任何非預期的狀況,否則不是特助跑來就是董事長跑來要我面對,情何以堪!

自從改了這種模式之後,我的主程式幾乎是八百年沒有再重新compiler過了,有任何問題,SP就可以跑出實際的表格長相,確認無誤之後,重新發送就是新格式了,管你要增加幾個要trace用的欄位值,林祖媽都沒在怕了。╮(╯_╰)╭



參考文件:
1.DataTable.Rows 屬性
2.如何以欄位名稱存取DataTable某欄位的數值

沒有留言:

張貼留言