2012年2月4日 星期六

寫ADO.NET程式的小建議

這幾天小弟被要求要去對報表的數字是否正確,其實我心裡是千百個不願意~
一來對數字,我認為是USER的職責,
二來是報表的程式,註解少到用手指頭都算得出來,
小弟最討厭看這種不寫註解的程式。

果不其然,當報表數字有問題時,回去看程式的SQL追問題時,因為程式不易閱讀,讓小弟看的很痛苦。 以下是幾點建議。

1. 一個Sql可以完成的事,不必用兩個Sql

比如,我們要去更新表格A的總消費金額欄位(CONSUME_AMT),你會選擇 :
 (a) 先下 Select A.CONSUME_AMT from A , 取出總金額到變數X
       然後 X = X+新消費金額, 再 UPDATE A set CONSUME_AMT=X
 (b) 直接下 UPDATE A set CONSUME_AMT= (CONSUME_AMT+ 新消費金額)

 這樣一看很明顯~~當然是選 (b)!!
 這支程式很多InsertUpdate都是用(a) ... 這樣也算了,但是它還犯了下面這個錯誤...



2. 避免直接拿DataTable.Rows[0][X]來組Sql

假設我們有多個來源表格: A, B , 要把A, B的某些欄位放到C

第一個Sql  : SELECT X, Y, Z ... FROM A

把結果放到 DataTable_A ~

第二個Sql : SELECT S, T, U ... FROM B

把結果放到 DataTable_B ~

然後InsertSql寫成這樣 :

String iSql = "INSERT INTO C (col02, col05, col01, ... )" +
                     "VALUES ( '"+ DataTable_A.Rows[0][15].ToString() +"','" +
                                               DataTable_B.Rows[0][11].ToString() +"','" +
                                               DataTable_B.Rows[0][0].ToString() +"','" +
                                               DataTable_A.Rows[0][10].ToString() +"','" +
                                               ... );


好的,我們現在發現表格C的某個欄位有問題,我們要回去找來源的資料,
問題來了,我們會先去找iSql,找出對應的欄位值是 DataTable_A.Rows[0][10].ToString() 
然後我們再回到 第一個Sql,開始去找這第十個欄位是哪一個A的欄位!!! 
如果沒有整理好的DB schema,會超級浪費時間!!

如果多寫幾行程式碼:
DataRow dr_A = DataTable_A.Rows[0];
String sC_COL_01 = dr_A["X"].ToString();
String sC_COL_02 = dr_A["Y"].ToString();
 ....

String iSql = "INSERT INTO C (col02, col05, col01, ... )" +
                     "VALUES ( '"+ sC_COL_02 +"','" +
                                              sC_COL_05  +"','" +
                                               sC_COL_01 +"','" +
                                               ... );

要找C的某欄位,可以馬上找到對應的欄位值為 sC_COL_XX
sC_COL_XX是不是很快可以知道是從哪一個表格的哪一個欄位帶過來的嗎?
是不是節省了很多時間呢?

而且sC_COL_XX這些變數,都可以重複再使用~~ 


(待續...)

沒有留言:

張貼留言