2008年6月27日

SQL 語法 max、mix、count...取值觀念釐清

還記得坎尼在 自定固定長度流水號的方法 中有提到過
要取得新ID 必需先將目前ID最大值給傳入嗎?
坎尼的作法就是利用 T-SQL 語法中的 select max(id) from table 來取得最大值

而最近坎尼一直在改同事的程式,發現到一個怪現象
他們一樣和坎尼用 max 去抓取目前最大值 id
然後回傳的是 DataTable,接著再用 DataTable.Rows.Count 去判斷

if(DataTable.Rows.Count != 0)
 ID = DataTable.Rows[0][0].ToString();
else

 ID = "0";

有人看出哪不對勁了嗎?

大家先看一下下列美美的抓圖







知道為什麼坎尼要下第一個 select 語法嗎?
第一個 select 不是什麼東西都抓不到嗎?
沒錯! 就是什麼都抓不到!
此時若是把這個查詢塞進一個 DataTable 中,DataTable.Rows.Count = 0

那為什麼要提這個呢?
原因就在於
當我們用 max、min 、count、avg....等語法時
如果資料表內無資料
它仍然會回傳一個值 (count是回傳0,max min avg則是回傳null)

所以,上述的判斷條件式應該改為
if(DataTable.Rows[0][0].ToString() != "")
 ID = DataTable.Rows[0][0].ToString();
else

 ID = "0";

同樣的bug坎尼已經抓過數次 (還是不同的同事寫的 囧>
所以提出此觀念讓還不知道的人了解一下

以上測試環境皆以 MS SQL 2000 為基準

課後補充
坎尼prefer的作法是,用MS SQL裡的 IsNull來判斷 (Oracle是NVL)
這樣抓取資料的人也不用再去判斷來判斷去

語法是 select IsNull(max(ID) , 0) as MaxID from Table

2008年6月26日

Gridview 排序及換頁

根據上篇 錯誤的示範 (這篇的東西看看就好)
坎尼決定開個新頁面來測一下 paging 及 sorting事件
首先提幾個上篇有誤的地方
1. paging事件仍然要重新取得 DataSource
坎尼上篇沒寫也有作用的原因是:我在 postback 有寫個 bind method 囧>
2. 同上點,排序及換頁都要重新取得 DataSource 然後 DataBind()

於是乎,估狗大神講的都是對的
坎尼不應該對神不敬 orz

下面的作法和各位在網路上查到的排序換頁事件應該差不多
如果你已對這個東西很熟了,不仿再看一下 XDDD


首先,先建立ViewState來記錄排序的順序及欄位


繫結 method
其中 GetDataTable() 是坎尼用來抓北風資料庫資料的 method
等等排序換頁事件都會呼叫本 method


換頁事件,很簡單,改個 PageIndex 然後呼叫 GetData()


排序事件,判斷的條件和上篇一樣
若是欄位和上次不同,一律用遞增
若是欄位相同,再去判斷排序為遞增或遞減
最後再去呼叫 GetData()

坎尼最近出差幫同事修bug
同事的天才程式讓坎尼改的腦袋都不靈光囉
所以上篇請各位當作笑話看看就好

2008年6月23日

VS 2005 排序事件

古人說「不管是DataGrid或是GridView,總有一天會遇到 Sort」

坎尼就是一直為這個排序事件苦惱
雖然從 VS 2003 時代 升級上來 VS 2005,DataGrid 也多了個兄弟叫 GridView
可是這個Sort事件一直沒有更簡單的寫法
(不要提 DataSource 那個會讓坎尼變精靈工程師的東西)

看看那個 Paging 事件,人家只要簡單的兩行就可解決
gv.PageIndex = e.NewPageIndex;
gv.DataBind();

坎尼一直天真的認為,Sorting應該也是這麼人性化才對
gv.SortDirection= SortDirection.Ascending;
gv.SortExpression = e.SortExpression;
gv.DataBind();
恩、Exception? gv.SortDirection gv.SortExpression唯讀 (翻桌)

後來坎尼去問了 估狗 大神
看到大家都是在Sorting做完判斷,再丟去另外個函式重新Bind
但是坎尼遇到的情況是,同一個Gridview會有兩種以上的DataSource
所以想出了下面這個方法 (當然部分是參考別人的寫法)



一樣要來解釋一下 (雖然註解都寫的差不多了)
首先,先取得 gv.DataSource 並放到一個 DataView 之中
再來,取得用 ViewState 記錄的 SortDirectionSortExpression
接著,再判斷如何排序 (方式請見上圖註解)
最後,利用 DataView.Sort 屬性進行排序,再 Bind 回 Gridview
別忘了把目前的 SortDirection 和 SortExpression 記錄在 ViewState中

好了 排序完成 收功
不過目前這個排序判斷版本仍稍為有點問題
可能要加上更加精確的判斷
只是坎尼目前修別人的bug已經修到腦子裡都是漿糊了
方法各位就請自行補完吧 哈 ^^

補充一點 (剛剛發現的)
圖裡的 gv.DataSource 可以直接用 DataView 來接
是因為坎尼在繫結事件時是寫 gv.DataSource = ds.Table[0].DefaultView;
若是寫成 gv.DataSource = DataSet1; (或是 gv.DataSource = DataTable1;)
此時在程式裡的 gv.DataSource 轉型就要注意

再補充一點
這段code只能用在只排序不分頁的事件中
所以....
並不適用於坎尼的這個case中
啊啊 又要想新的解法了 Orz

2008年6月22日

A Survey of .NET Languages And Paradigms

see this MSDN Article.

裡面也有講到 F# 喔,不過我也才剛看了前面兩段 :p
不知道甚麼時候我才有空整理 5/24 那次微軟研討會 (.NET 3.5 & F#)的報告,
看來除非我週末要非常認真,都不休息才有可能吧 ..Orz

2008年6月21日

幾個好用的 VS.NET 快速鍵

1. CTRL + TAB = 切換.NET開啟視窗
這是坎尼前幾天才發現的快速鍵
剛發現時驚為天人 以後就不需要用滑鼠去點左上角的 ▼ 了
(不過坎尼前幾天才被指出快速鍵用太多 左手腕部要多注意 orz)

Ctrl + Tab 會出現目前有開啟的頁面 及 目前有使用的工具
按了 Ctrl + Tab 後 再按一次 Tab會跳往下一個頁面
另外,按了Ctrl + Tab後,Tab就可以放開了 ( Ctrl 還要按住)
此時可以用十字鍵或滑鼠選擇要到的頁面或工具視窗
選完後再放開 Ctrl 就行了

2005的畫面

2008的畫面 多了內容顯示且超漂亮


2. #region後 + Tab = 自動 endregion
如果常用region的人應該要會這招
個人認為region在2003時可說是非常難用,但05之後又是另一回事
只要在鍵完 #region 後按 Tab 就會出現下圖的畫面

此時可以按 backspace 把 MyRegion消掉 換成自定的Region Name
輸入完名稱之後按 Enter 即可

3. Ctrl + G 跳至指定行數

這是和 Ctrl + F 功能差不多的快速鍵
坎尼認為非常實用,搭配 Ctrl + F 就可以讓你悠游在上萬行的程式碼中


4. aspx頁面 + F7 = 進入後端 Code
這也是坎尼常用的快速鍵之一 (都一直用快速鍵,難怪會被警告)
前後端切換就不用再去點 方案總管 → 檢視程式碼
另外剛剛做了測試
若是頁面為 "不另存cs檔" 的格式 按下F7只會切換至頁面Source

5. cs頁面 + shift + F7 = 進入 aspx 頁面 (如果有的話)
第4點的兄弟,故不贅述

今天好用的快速鍵就介紹到這邊
其他像 Ctrl + C、Ctrl + V .....那些大家都很常用的就不提了
若是還有其他好用的快速鍵 坎尼會再分享給大家
當然也歡迎大家留言提供 ^^

2008年6月19日

"<" + "/script>" 的迷思

今天和Tim討論到標題這個東西
以前我同學在組前端的 javascript code 時
總會看到他在最後結尾時 把"</script>" 拆成 "<" + "/script>"
當時書上似乎也都是這麼作 所以我們都把它當成理所當然
不過就在多年後 坎尼總覺得怪怪的 為什麼不寫在一起就好了呢?
經過多次試驗 "</script>" 一直很正常啊 怪怪~

後來坎尼發現了以下的解釋 (以下講的都是個人推論 有錯請指正 ^^)


首先,坎尼認為會拆成兩段來寫的原因是:
這是個把程式寫在前端的aspx
我們直接看下圖用實例來說明
'
基本上大多數的人在新增一個頁面時
並不會把 將程式碼置於個別檔案中 這個打勾給去掉
所以我們會看到 aspx 和 aspx.cs 兩個檔案
但若是把打勾去掉呢? 那麼原本要寫在cs裡的code 就會變成寫在前端
此時aspx的頁面會在最上方增加 <script runat="server"></script>
所有的事件程式撰寫都會在這個範圍內


所以當我們要在後端輸出 javascript時 (如上圖)
寫下 Response.Write("<script> alert('aaa'); </script>") 時
.net 會跟你講這段程式碼有誤
所以坎尼猜,大概是它直接把 </script>
當成是最前面的 <script runat="server"> 的結尾

不過很神奇的是,若是我們把結束的 </script> 給拆開 (如下圖)
就又一切安然無事....

當然,以上那種情形在目前也不常見啦 (現在寫前端的應該不多吧?)
當時坎尼剛學 .net 時,剛好是 asp 轉 asp.net
很多人似乎都是從 asp 轉型過來 所以仍是習慣在前端頁面寫些東西
而那時看的書也都教這種 寫在前端 的方式
所以當時的人大概發現了 直接寫 "</script>" 來結束 javascript 行不通
於是乎都演變成 拆開寫 這種方式

以上純屬坎尼猜測
至於在 .cs 裡去撰寫呼叫 javascript
請安心的寫 </script> 吧 至少坎尼寫到現在都沒看到有誤
如果真的這麼寫會出錯...那就............寄信來跟坎尼說一下吧 XD

2008年6月16日

如何取得數字集合中之最大值

這東西其實大家應該都有遇過
不知道各位會怎麼去寫呢?

這邊坎尼提供個方法
只要將數字集合的陣列傳入
就會回傳最大值回來


稍微解釋一下
這個方法傳入的是要用來比較的數字集合
在方法中,坎尼用了個 intMax 來記錄最大值
再用迴圈,兩兩互相比較,最後回傳的 intMax 就是最大值啦

下面是開發時的使用方式,先是頁面控制項的配置
上方的 textbox 是給使用者輸入「以 , 隔開之數值集合
下方的 textbox 則是顯示出上面輸入的數字集合最大值

下圖是 Button 事件,按下後,會將 TextBox1 的值切成陣列
然後再傳進去給 GetMax 方法,以取得 TextBox2 的值

實際執行結果如下

上面講的應該還ok吧?
再來講個 .net framework 3.5才有的東西

在 vs2008裡,這些集合可以引用 IEnumarable的方法
所以我們直接呼叫內建的 int[].Max<>(),好了,收功

下圖是改良過的方法,不過坎尼在轉型時一直出錯
本來想寫個帥氣的一行,可惜研究不足,失敗,哈哈
當然下面也可以一行解決啦,前提是傳進來的是 數值陣列


以上,今天的講座一點也不精彩,哈

2008年6月15日

如何在啟動AP時自動縮到工具列

星期五一直到昨天半夜,坎尼一直在和朋友們交際應酬
這幾天真的無力上來發新文 (因為回家就是睡覺 太累了 囧>)

標題指的就是下列這個畫面


首先我要來講一下 NotifyIcon這個Control
一般我們用軟體時,按下縮小鍵就會自動縮到右下角那排去
顯示的圖片 就是利用這個NotifyIcon

這個作用的原理並不是真的把東西給縮下去
而是利用 Form.Hide() 把我們的程式畫面給隱藏起來
再把NotifyIcon顯示出來

當然,NotifyIcon的功用不只是這樣
通常,使用者在這些 icon 上按右鍵然後會顯示Menu
就是利用到 contextMenuStrip + NotifyIcon
不過這個不是這篇要講的,就此打住好了

所以根據上面看似很多其實沒什麼的廢話可以得知
要做成縮到工具列這個功能需要兩個步驟
1. Form.Hide()
2. NotifyIcon1.Visible = true

所以我們在AP的開發畫面上拉一個NotifyIcon的控制項
設定顯示的 Icon (一定要設,因為它沒預設的圖片)

再打開 Form Resize 事件寫下下面這段Code

這時其實我們的功能已經完成一半了
對了,先別著急,把 NotifyIcon MouseDoubleClick 事件打開
寫進下面的Code吧,不然一縮下去就沒救了
到時可別怪坎尼沒說喔 哈

此時就可以執行一下程式來看效果


但是我們要如何做到一開啟程式就直接隱藏起來呢?
不就是在Load事件裡寫下上面的程式碼嗎?
坎尼一開始的想法也是這樣,不過左試右試,呃...怎麼都不會動

好吧,坎尼就不賣關子了 (其實是想休息了 orz)
我們要做的動作很簡單
1. 到 Form 的屬性設定 WindowState = Minimized (如下圖)

2. 在 Form_Load 的事件裡寫下 this.Hide()


第一點就是讓程式在啟動時,視窗的狀態是最小化
第二點就是讓程式隱藏起來

為什麼不寫NotifyIcon1.Visible = true呢?
因為我們已經寫在Resize事件裡,並不需要特別再寫一次
但是不知道為什麼 Hide() 一定要寫,這是坎尼試出來的結果
以上,若有人想開發常駐程式可以參考看看 ^^

2008年6月12日

ConvertZ 會造成 .snk 檔案損毀

如同在上一篇Blog中提到的,前陣子因為把 OS 重灌成 Vista (English) 之後,完全不支援 Big5,因此利用 ConvertZ(8.02) 批次將整個專案的內容轉換為UTF-8,但是轉換後發生一個問題,重新 compile solution 的時候,會出現「建立組件資訊清單時發生錯誤:資料錯誤。」的錯誤訊息,完全搞不懂發生什麼事情。

從昨天下午Try到今天早上終於發現,當我在 AssemblyInfo.vb 中刪除 KeyFile 的路徑(也就是不要去 build Strong-Name DLL)之後,solution 就可以正常 compile 了!只要指定 KeyFile 的路徑,就會發生上述的錯誤,因此懷疑八成是 KeyFile 本身損毀。果然,從 version control server 上面抓下來舊的 .snk 有 596 bytes,但是經過 ConvertZ 轉換後的 .snk 剩下 2 bytes,看來裡面的內容是整個消失了。討厭的地方是,在 Windows 裡面,低於 1kb 的檔案大小永遠顯示為 1kb,因此沒有細看內容還真的很難發現檔案大小的差異。因此我把舊的 .snk 覆蓋掉新的 .snk 之後,solution 又恢復正常了。

後來我再做了一次實驗,果然經過 ConvertZ 的轉換,.snk 檔會從 596 bytes 變成 2 bytes,造成 IDE 吐出等於廢話的錯誤訊息 ...

似乎在 VS 2003 裡面,預設會將檔案編碼設定為 Big5,但是到 VS 2005 就會設定為 UTF-8,
在現在的環境裡面,不用 Unicode 簡直就是愚蠢阿,Google 前陣子的 blog 中就有提出,根據他們龐大的網頁檢索資料,採用 Unicode 的網站數量穩定上升,幾乎其他所有編碼的網站數量都穩定下降。

有需要將 VS2003 專案轉換為 VS 2005 並且一並處理編碼轉換的朋友,要小心了 ...

2008年6月11日

自定固定長度流水號的方法

不知道有沒有人在開發系統時有沒有這個困擾?
就是資料表的ID值為一固定長度,但如同流水號一樣編碼?
舉例來講,第一筆資料為00001,第15筆資料為00015

一般來講我們會怎麼做呢?
我剛開始遇到這個情況時 (好幾年前在當學生做系統時)
都會寫上長長一段 if else
if(n < 10) strID = "0000" + n.ToString()
else if (n < 100) strID = "000" + n.ToString()
..............................

要是位數定長一點,就等於是宣告坎尼的死期了 囧>
所以,如果還有人像坎尼好幾年前那樣笨笨的寫if else的人
記得把下面這兩個string的方法給記起來:PadLeft , PadRight


第一個參數不用講,就是前述情境所說的 要傳入的id值
第二個參數為字串的長度.....就是要回傳的長度
第三個參數為補齊字元,把剩下的長度補齊用
比方說傳入0,會傳出00001這類的字串
傳入@,回傳的字串就會是 @@@@1
最後一個參數是要補齊的方式:有LeftPad和RightPad兩種
LeftPad → 00015 , RightPad → 15000

其實參數講完,上面這個方法的內容也不太需要講了 XD
要注意的就是,傳入的ID記得加1 (因為我是傳入目前最大的ID,新ID必需加1)

Response.Write("New ID is " + GetNewID(1,6,'0',"left"));
上面這串程式碼就會在畫面上顯示出:New ID is 000001

2008年6月10日

如何增進網站的效能

沒想到砍泥這麼認真的碎碎念,那我也把之前搜集到的一些東西貼上來好了。

自從前陣子認識到YUI之後,感覺Yahoo在UI這個部分累積的成果真的蠻可觀的,其中有一篇文章叫做「Best Practices for Speeding Up Your Web Site」(其中提到應該將多個 .CSS / .JS 檔案合併成單一檔案以改善效能,剛好微軟前陣子在.NET Framework 3.5 SP1 Beta 中就有提到這個 enhance),Google的這篇blog也參考上面的文章作為guideline來改善網站效能,這是 UI design 中和 developer 比較有關的部份,參考一下囉~

讀取文字檔中的特定行數資料

今天我同事又來一個問題了
因工作需要,他必須把某個文字檔的特定行數取出來
加以運算之後再寫回去
這東西沒啥需要做什麼解釋的,我們就進程式碼吧
本範例只講如何讀取,寫回去...對大家來說應該不是難事吧XD


這個範例是讀取 c:\text.txt
並將檔案裡的第2行 第5行 及第9行之後的資料給讀出來
重點就是需要加個 int 的計數器去算出行數
第二個重點是,就算不符合條件,也要呼叫ReadLine()
這樣StreamReader才會把Stream往下一行推


這是text.txt的內容,為了顯示好看,坎尼稍微做了點調整


讀出來的結果

在寫這篇的時候,坎尼發現其實註解都寫的差不多了 orz
所以文章裡的文字就不必太多 ^^

利用VS2005升級精靈轉換舊VS2003專案之後無法Compile / 無法自動產生 TestMethod

自從我的XP掛了,換成用Vista(English)之後,誤打誤撞解決了一些問題,除了利用ConvertZ批次將檔案轉換為UTF-8之外(OS現在遇到 Big5 就死給我看),陸續還解決以下兩個問題:

1.Error creating assembly manifest: The Parameter is incorrect.(建立組件清單時發生錯誤: The Parameter is incorrect.)
2.利用 VS2005 轉換精靈將專案從 VS2003 升級後,無法自動產生Test Method。


解法(將 .NET 1.1 專案升級到 .NET 2.0 的建議作法):
1.利用 VS2005 轉換精靈將專案從 VS2003 升級到 VS2005
2.重新建立一個方案,然後利用Add Exist Items的方式,將上述升級過的專案中的檔案複製到新的專案


上述的第一個問題在網路上討論的很少,根本不知道在錯甚麼,唯一看來比較相關的 MS 網頁現在是404 Not Found…由於程式都沒變動,實在不知道為什麼無法Compile,原本以為是 DLL 的 GUID 衝突,但結果也不是。

至於第二個問題也是 Try 很久,除了自動產生Test Method之外,在新增.resx檔案時,
有時候會自動產生對應的Designer.vb,有時候又不會,也是很詭異。


我發現用VS2005產生出來的全新專案 (包括 Class Library、Windows Application、Windows Service 等等),預設的目錄結構跟從VS2003升級來的專案不太一樣,目前注意到的主要是MyProject裡面的內容:










從VS2003升級的話,裡面應該是空的。


我猜想可能是利用升級精靈只是讓VS2005可以有辦法重新Compile舊的程式,但想要增加新功能的時候,運氣不好的話就可能遇到各種奇怪的情況(以我這台Vista的情況來說,根本連Compile都無法執行),按照目前的經驗,重新製作一個完全符合VS2005架構的專案應該是比較保險(& 健康?)的做法。


由於目錄&檔案架構的差異,重新製作新的專案的時候要注意以下幾點:
1.AssemblyInfo.vb這個檔案,在新的專案裡會被放到MyProject之中,因此加入舊有項目的時候要注意不要加入這個檔案,看是要直接複製檔案內容,或是在新的專案的 “屬性” 頁中去調整,要注意GUID要維持一致,
不然會影響每一個Web.config / app.config 中區塊的設定,如下圖:














2.簽署組件的時候 (也就是賦予組件strong name,才能註冊進GAC),也是透過專案屬性頁上的設定來完成,舊的方式是在AssemblyInfo.vb中指定金鑰檔的相對路徑,但是從vs2005的畫面上設定的話,設定值就不知道被藏到哪裡去了(AssemblyInfo.vb中是看不到的),然後KeyFile會被複製到每個專案的目錄下,參考下圖:














其他就沒甚麼太特別的,專案型態要選對(Class Library / Windows Application / Windows Service / Web Service),然後.resx檔案在升級的時候一定會不見 (消失在升級後的專案中,這點實在很煩也很蠢),必須要手動加回來。

以上是將專案從 .NET 1.1 升級到 .NET 2.0 的心得,未來有需要升級到 .NET 3.5 我想也會用一樣的作法(升級精靈 + 新建專案 & Add Exist Item),才不會浪費寶貴的生命...

2008年6月9日

阿拉伯數字轉中文數字

標題還真是不知道該怎麼下...(汗)

各位不知道有沒有遇到過
客戶要求顯示的資料中,阿拉伯數字一律改成中文的數字表示方式?
說真的 坎尼的同事就遇到過 (總覺得這種要求只會在台灣看到)
不過他是要改成全型的顯示方式:1→1 2→2

所以坎尼就教他一個投機的方式
先建立一個array依序存放著 0~9 的其他表示方式
再將該需要轉換的數字直接丟進去就好

今天中午休息前又想到這個東西 (距離跟我同事提已經過了一個多月)
所以下班後又做了個轉換method 以下是部份程式說明


這是aspx中的畫面,上方的TextBox是user輸入文字框
下方的TextBox是轉換過顯示的文字
Button "轉換" ,不用說,當然是發生轉換事件啦
另外坎尼加上ScriptManager及updatePanel,讓轉換過程不閃畫面













上圖就是轉換的method
首先,在method裡建立所要轉換的char[] array
再將傳入的index丟入array中,並回傳
method要傳入的參數有兩個,第一是數字的index,第二是type
這個type各位可以自訂,圖中我是隨便用1234來帶過


上圖是"轉換"按鈕按下發生的事件
重點是先將輸入的文字轉為charArray (用 .ToCharArray方法)
再將char轉成Int一個一個傳入method中
這邊投機的方式是用try catch,只要轉型失敗即跳過 (表示非數值型態)

20090508 修正:
其實這邊要用 char.IsNumber 的方式來判斷才對
用 try catch 對於大量文字的轉換效能極差
(圖也修正為用 char.IsNumber 的方法)

上圖是程式執行畫面,轉換Type是第3種 (也就是一二三四五那個)

DataTable極意之道

這星期五坎尼去逛了一下書店 很久之前就想買的這本
極意之道次世代 .NET Framework 3.5 資料庫開發聖典 ASP.NET 篇
也剛好在書店中,坎尼就順手牽...嗯...是順手買下... 請不要當真orz

於是這週末除了打電動看動畫陪閃光之外,剩下的時間就是看書啦
之前說要把DBDocument做個改寫也忘了 囧>

不過這本書裡提到DataTable的許多用法
可以把DBDocument的Code給改善許多
首先是 sp_columns 這個取欄位資訊的 stored procedure
可以用 DataTable.Columns[n].xxxx 屬性來取得
比方說
DataTable.Columns[n].ColumnName //取得欄位名稱
DataTable.Columns[n].DataType //取得欄位型態

因此我們可以寫成以下這樣的Code
DataTable dt = new DataTable();
DataAdapter1.Fill(dt);
//其他部分我就省略了,Sql指令:
select * from myTable1 where 0=1
foreach (DataColumn dc in dtOld.Columns)
Response.Write("Column Name="+dc.ColumnName+"<br />");

這樣就會把所有的欄位名稱給列出來
基本上所有的屬性應該都會有才對
不過目前手邊沒書可參照,還有些屬性沒找到 (像size)

然後還有個 Caption 屬性,可以編集要顯示的名稱 (預設為ColumnName)
不知道caption的依據是什麼
說不定可以應用至DBDocument的欄位中文名稱顯示

最後,等我修成這本極意之道,再來跟大家報告心得吧
有興趣的人也可以去書店翻翻看,是本值得推薦的好書
(我推薦好像沒啥說服力 orz)

再補充一下,本Blog的另一位作者 Tim,是坎尼的大學同學
目前文章只會有我們兩個編寫
未來坎尼會多找幾位同學一起來blog分享他們的知識的 ^^

2008年6月7日

Silverlight 2 Beta2 Released

See ScottGu's Blog Post.

我覺得最重要的是「Control Template」和「Visual State Manager (VSM)」(雖然其他還有很多變動,幅度好大...),對於一個大型的應用系統來說,能夠很方便的管理 Control Style 是很重要的,在 WinForm 似乎只能透過繼承的方式來實現,相當麻煩,除非把所有 Style 的設定值放到 Config (Web / App),不然很難在不重新 compile 的情況下更換 Style。

至於 VSM 的部份,看來還是著重在單一 Control 的狀態改變上,相信應該是蠻方便的 (等我的 Demo AP 做好再上來分享XD),不過對於「換頁」的機制來說,可能還是要參考 Jesse Liberty's Blog Post,沒有 Web 上熟悉的標準「Response.Redirect」or「Server.Transfer」感覺真是不太習慣。

前陣子公司的工讀生(一個政大資科所的怪咖)demo 了一個 flex 版的 Pet Store,看來目前在 Flex 那邊對於大型的商業應用系統還是比較成熟,背後有類似 State Chart 之類的機制來負責整個系統內畫面的轉換,希望 SL 這邊以後會有更好的機制(目前看來更新速度是很快的),更希望我上班只要負責 Survey 這個 Topic,其他都不用作 =.= ...

2008年6月5日

SQL Server表格管理小工具

構想參考 使用GridView顯示Sql資料庫的Table Layout(Schema)


在某天看了上述連結中,小喵大示範的教學
坎尼嚇到差點尿出一身汗 (嗄?)
原來SQL SERVER裡存在著這麼方便的Stored Procedure (明明就是你弱)
所以利用了上週六半天的時間 實作了 C# Windows AP版本
(還好閃光很乖的在旁邊打NDSL)

說真的 坎尼懂的只有概念
小喵大的程式卻只看的懂一半左右 囧興

不過只要懂得以下幾項劍意,劍招自然也就不需理解太多...
//取DataSource中表格
exec sp_tables
@table_name = '%' ,
@table_owner = 'dbo',
@table_qualifier = @DBName;

//取表格中所有欄位資訊
sp_columns 'TableName'
//取表格中所有的pk欄位
sp_pkeys 'TableName'
//取表格中所有有填寫備註的欄位資訊
Select * FROM ::fn_listextendedproperty(NULL, 'user', 'dbo', 'table', @TableName, 'column', default)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

另外,這個小工具和小喵大的網頁版最大的不同是
本工具表格的說明是存於xml檔中
不是自己在資料庫又開一個資料表去存喔
好處就是存檔快 換電腦也不用再到Sql Server中開新Table
而且每台有Sql Server 2000以上的電腦都能使用

最大的缺點就是...要是存檔的xml砍掉了就一切得重來
不過顧及普遍性及好用程度 最後還是決定存成xml啦
要用的人最好一段時間就把xml備份到網路上去吧

本來坎尼還想作出修改欄位和匯出的功能
但是修改卡在找不到有什麼預設的Stored Procedure去修改
匯出功能想用OWC 可是又不熟
且用OWC元件勢必又要把dll放在執行檔旁邊 令人討厭

所以基本功能在上星期六完成後 就一直沒繼續往下做完的原因在此
要是有人知道預設的Stored Procedure裡有修改欄位資訊的
請務必連絡 33345678 啊 不是 請留言 (我只知道sp_rename)
0506 10:55 新增
就在剛剛同學鵝蛋丟了個msn給我:用 Alter Table 就好了啊 =.=
我還真的完完全全忘了這個東西的存在
看來我回學校去和學弟妹們重上DataBase的課好了 orz
翻了一下T-SQL語法,看來直接用這個工具修改TableSchema是可行的
明天又是個星期六 來研究一下語法和把剩下的給做一做吧 :p

OWC我就慢慢的翻google到的東西吧 哈

最後的最後 人云:沒圖沒真相
所以 真相來了

程式下載
How to Use

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D