2013年11月30日 星期六

C# 傳遞參數

C#因有著和Java非常相似的特性,如果有使用PHP開發的經驗,接觸JSP時,對於寫Web的人來說,會有不習慣的地方。筆者在此分享C#參數的相關語法與觀念。‧C# 參數傳遞可分為傳值和傳參考。

namespace CS_Array_Method
{
    class Program
    {
        static void ShowXY(int x, int y)
        {
            x += 10;
            y += 10;
            Console.WriteLine("ShowX:x={0},Y:y={1}", x, y);
        }

        //設定XY
        static void SetXY(ref int x, ref int y)
        {
            x += 10;
            y += 10;
            Console.WriteLine("SetX:x={0},Y:y={1}", x, y);
        }

        //設定陣列儲存的參數
        static void SetArray(int x, int y, int[,] a)
        {
            int i, j, k = 0;
            for (i = 0; i < x; i++)
            {
                for (j = 0; j < y; j++)
                {
                    k++;
                    a[i, j] = k;
                }
            }
        }

        //顯示陣列內容
        static void ShowArray(int x, int y, int[,] a)
        {
            int i, j;
            for (i = 0; i < x; i++)
            {
                for (j = 0; j < y; j++)
                {
                    Console.Write("a[{0}][{1}]={2} ", i, j, a[i, j]);
                }
                Console.WriteLine();
            }
        }

        //執行結果
        static void Main(string[] args)
        {
            int[,] data;
            data = new int[3, 4];
            int x = 10, y = 20;

            Console.WriteLine("x={0},y={1}", x, y);
            ShowXY(x, y);
            Console.WriteLine("x={0},y={1}", x, y);
            SetXY(ref x, ref y);
            Console.WriteLine("x={0},y={1}", x, y);
            ShowArray(3, 4, data);
            SetArray(3, 4, data);
            ShowArray(3, 4, data);
            Console.ReadKey(true);
        }
    }

}

在這裡,只是一個非常單純的透過靜態的方法存方所有X、Y的參數,透過陣列,將參數依序傳遞並顯示結果。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年11月29日 星期五

Team Foundation Server - Check In簽入

有在工作上和團隊開發的人,都一定會用過像SVN這類型版本控管的工具。微軟Microsoft的雲端系統產品Windows Azure 也有版本控管的功能,透過Team Foundation Server裡的Check in(簽入)就能達到同樣的效果。

在有修改的項目上,按滑鼠右鍵->Check in,就會切換到簽入的操作畫面



2.最上方會有一個Comment,底下有一個填空項,可以填入說明的部分。

3.中間的Included Changes,就是選擇出來要更新到Windows Azure上的項目。



4.下面Excluded Changes,底下的項目,就是開發者還未決定要Check in到Windows Azure的項目當中。可以從這地方,托拽到上方的Included Changes。


  • 左邊Included All功能就是不用選擇,全部都更新到Windows Azure。
  • 中間的Show All的功能,就是讓開發者看到所有的項目,Show Solution Changes功能是只顯示已更改的項目。Custom Filter功能是可以定義要顯示的內容關鍵字。
  • 右邊Detected功能是Team Foundation Server自動偵測已加入或變更的項目。



5.當選擇好並打上註解後,就可以按最上面有一個Check In的按扭,就完成了版本控管更新的動作。



-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年11月28日 星期四

C# - Regular Expression 正規表示法

這門知識,其實我也是最近才硑究,不過其實實用性還蠻廣的,尤其是對字串處理這門課而言,如果想要深造,這我想是必修的課程。當然,下面這些知識,有許多部分是參考官方的內容。

Regular Expression 稱為「正規表達式」或「字串篩選條件」,大部分簡稱RE,它為敘述一句符合某段句法規則之字串的字串,通常用來找尋與驗證或替換符合規則的字串,是個強大的字串匹配的類別。
Visual C# 中為 Regex 類別,在此就使用它為基礎做介紹。
Regex 建構函式有二:
Regex regex = new Regex(string pattern);
Regex regex = new Regex(string pattern, RegexOptions options);
以上 string pattern 為規則字串,RegexOptions options 為字串比對選項,是一個列舉型別,以下為它所有列舉值的成員與說明:
編號 成員名稱 說明 
01Compiled指定規則運算式要編譯為組件,這將產生較快速的執行,但會增加啟動時間。
02CultureInvariant指定忽略語言中的文化差異。
03ECMAScript啟用運算式的 ECMAScript 相容行為,這個值只能結合 IgnoreCase、Multiline 和 Compiled 值使用,將這個值與任何其他值一起使用都將導致例外狀況。
04ExplicitCapture指定唯一有效的擷取為明確命名的或編號的,格式為 (?…) 的群組。這允許未命名的括號充當非擷取群組,而避免運算式 (?:…) 的語法不便。
05IgnoreCase指定區分大小寫的比對。
06IgnorePatternWhitespace從模式排除未逸出的泛空白字元 (White Space),並啟用以 # 標記的註解。不過,IgnorePatternWhitespace 值不會影響或排除字元類別中的泛空白字元。
07Multiline多行模式,變更 ^ 和 $ 的意義以致它們分別在任何一行的開頭和結尾做比對,而不只是整個字串的開頭和結尾。
08None指定無選項設定。
09RightToLeft指定搜尋將由右至左,而非由左至右。
10Singleline指定單行模式,變更點 (.) 的意義以至於它符合一切字元 (而不是 \n 之外的一切字元)。
以上表格轉自:

所以宣告時,要加入這些比對選項的列舉值,可以如以下宣告 ( pattern 為規則字串 ):
//單一比對列舉值宣告
Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);

//多個比對列舉值宣告
Regex regex = new Regex(pattern,RegexOptions.IgnoreCase 
                                | RegexOptions.Compiled 
                                | RegexOptions.Singleline );
接下來就開始介紹 Regular Expression 的語法規則:
編號字元描述
01 \ 將下一個字元標記為一個特殊字元、或一個原義字元、或一個向後參照、或一個八進制轉義符。例如,「n」匹配字元「n」。「\n」匹配一個換行符。序列「\\」匹配「\」而「\(」則匹配「(」。
02 ^ 匹配輸入字串的開始位置。如果設定了RegExp物件的Multiline屬性,^也匹配「\n」或「\r」之後的位置。
03 $ 匹配輸入字串的結束位置。如果設定了RegExp物件的Multiline屬性,$也匹配「\n」或「\r」之前的位置。
04 * 匹配前面的子運算式零次或多次。例如:Gooo*gle 能匹配 Google、Goooooogle。* 等於 {0,}。
05 + 匹配前面的子運算式一次或多次。例如:Gooo+gle 能匹配 Gooogle、Goooooogle,但不能匹配 Google。+ 等於 {1,}
06 ? 匹配前面的子運算式零次或一次。例如:Gooo?gle 只能匹配 Gooogle 和 Google。? 等於 {0,1}
07 {n} n是一個非負整數。匹配確定的n次。例如:o{3} 能匹配 Gooogle 的 ooo,但不能匹配 Google。
08 {n,} n是一個非負整數。至少匹配n次。
09 {n,m} m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次
10 ? 當該字元緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})後面時,匹配範式是非貪婪的。非貪婪範式儘可能少的匹配所搜尋的字串,而預設的貪婪範式則儘可能多的匹配所搜尋的字串。
11 . 匹配除「\n」之外的任何單個字元。要匹配包括「\n」在內的任何字元,請使用像「[.\n]」的範式。
12 (pattern) 匹配pattern並獲取這一匹配。( ... ) 有群組的意思。例如:(ab) 能匹配 abc 中的 ab,但不能匹配 acc。
13 (?:pattern) 匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行儲存供以後使用。例如:run(?:n|ning) 能匹配 running 整個字串,並且從此字串後繼續比對。 
14 (?=pattern) 正向預查,在任何匹配pattern的字串開始處匹配尋找字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如:Office(?=2003|2007|2010) 能匹配 Office2003 中的 Office,但不能匹配 Office2005 中的 Office,而從 Office 字串後繼續比對。
15 (?!pattern) 負向預查,在任何不匹配pattern的字串開始處匹配尋找字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如:Office(?!2003|2007|2010) 能匹配 Office2005 中的 Office,但不能匹配 Office2010 中的 Office,而從 Office 字串後繼續比對。
16 x|y 匹配x或y。
17 [xyz] 字符集合。匹配所包含的任意一個字元。
18 [^xyz] 負值字符集合。匹配未包含的任意字元。
19 [a-z] 字元範圍。匹配指定範圍內的任意字元。
20 [^a-z] 負值字元範圍。匹配任何不在指定範圍內的任意字元。
21 \b 匹配一個單詞邊界,也就是指單詞和空格間的位置。
22 \B 匹配非單詞邊界。
23 \cx 匹配由x指明的控制字元。例如,\cM匹配一個Control-M或Enter符。x的值必須為A-Z或a-z之一。否則,將c視為一個原義的「c」字元。
24 \d 匹配一個數位字元。\d 等於[0-9]。
25 \D 匹配一個非數位字元。\D 等於[^0-9]。
26 \f 匹配一個換頁符。\f 等於\x0c和\cL。
27 \n 匹配一個換行符。\n 等於\x0a和\cJ。
28 \r 匹配一個Enter符。\r 等於\x0d和\cM。
29 \s 匹配任何空白字元,包括空格、製表符、換頁符等等。\s 等於[\f\n\r\t\v]。
30 \S 匹配任何非空白字元。\S 等於[^\f\n\r\t\v]。
31 \t 匹配一個製表符。\t 等於\x09和\cI。
32 \v 匹配一個垂直製表符。\v 等於\x0b和\cK。
33 \w 匹配包括底線的任何單詞字元。\w 等於「[A-Za-z0-9_]」。
34 \W 匹配任何非單詞字元。\W 等於「[^A-Za-z0-9_]」。
35 \xn 匹配n,其中n為十六進制轉義值。十六進制轉義值必須為確定的兩個數位長。例如,「\x41」匹配「A」。「\x041」則等價於「\x04&1」。正則運算式中可以使用ASCII編碼。
36 \num 匹配num,其中num是一個正整數。對所獲取的匹配的參照。例如,「(.)\1」匹配兩個連續的相同字元。
37 \n 標識一個八進制轉義值或一個向後參照。如果\n之前至少n個獲取的子運算式,則n為向後參照。否則,如果n為八進制數位(0-7),則n為一個八進制轉義值。
38 \nm 標識一個八進制轉義值或一個向後參照。如果\nm之前至少有nm個獲得子運算式,則nm為向後參照。如果\nm之前至少有n個獲取,則n為一個後跟文字m的向後參照。如果前面的條件都不滿足,若n和m均為八進制數位(0-7),則\nm將匹配八進制轉義值nm。
39 \nml 如果n為八進制數位(0-3),且m和l均為八進制數位(0-7),則匹配八進制轉義值nml。
40 \un 匹配n,其中n是一個用四個十六進制數位表示的Unicode字元。例如,\u00A9匹配版權符號(©)。
以上表格轉自:
http://zh.wikipedia.org/zh-tw/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年11月27日 星期三

運用Hosts在本機端開發OpenID和OAuth


對於有開發過OpenID和OAuth都大概知道其流程和結構,透過OpenID的驗證,取得的資訊,會回傳至原生的DomainName。但是開發的時候,程式的修改,就要放到已對外連結路由的主機上,才能做測試。如果是像PHP的開發,那是比較省時,還不會太麻煩。但如果是遇到像JSP或者Windows Azure這種開發環境底下,每一次的更新等待,都是很耗時的。筆者在一個文章談到「Windows 8修改Hosts文件方法」(不同的winodows系統都可以做設定),我們可以透過Hosts的特性,來達到一個「欺騙」,進而讓OpenID或OAuth的系統計算導向的原生位置,轉而導向127.0.0.1。怎麼做呢??很簡單。

在hosts文件底下呢,輸入127.0.0.1     example.comexample.com這個就是開發者和ISP或者某家廠商所提供的設定底下的domain name,例如:www.myhome.com。新增完之後,當開發者透過Visual Studio底下執行並除錯時,向OpenID或OAuth所取得的資訊之後導向的位置,就會透過hosts的控制下,成功的從OpenID或OAuth系統取得參數。如此一來,開發者就可以透過本端進行開發除錯,減少許多更新部暑的時間。

host的路徑各OS略有不同,在Win 7和Win 8是在C:\Windows\System32\drivers\etc底下。



-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年11月26日 星期二

Windows 8修改Hosts文件方法

淺談

在了解Windows 8的hosts設定之前,對於不太解hosts這東西之什麼玩意時,先來了解一下什麼是hosts。

hosts檔案是一個用於儲存電腦網路中各節點訊息的電腦檔案。這個檔案負責將主機名對映到相應的IP位址。hosts檔案通常用於補充或取代網路中DNS的功能。和DNS不同的是,電腦的使用者可以直接對hosts檔案進行控制。hosts檔案在不同作業系統(甚至不同Windows版本)的位置都不大一樣。

Hosts是一個沒有副檔名(extension)的系統文件,可以用記事本等工具打開,其作用就是將一些常用的網址域名與其對應的IP地址建立一個關聯數據庫,當用戶在瀏覽器中輸入一個需要登錄的網址時,系統會首先自動從Hosts文件中尋找對應的IP地址,一旦找到,系統會立即打開對應網頁,如果沒有找到,則係統再會將網址提交DNS域名解析服務器進行IP地址的解析。

用途

hosts檔案也可以用於其它情況,例如可以將已知的廣告伺服器重定向到無廣告的機器(通常是原生的IP位址:127.0.0.1)上來過濾廣告。同時也可以透過不下載網路廣告,從而減少頻寬。使用hosts檔案還可以減少對DNS伺服器的存取來加快存取速度並減少頻寬消耗。
hosts檔案的另一個重要用途就是用於攔截一些惡意網站的請求,從而防止存取欺詐網站或感染一些病毒惡意軟體。但同時,這個檔案也可能被病毒或惡意軟體所利用來阻止使用者更新防毒軟體或存取特定網站。但也可以導向某個指定的DNS和IP,例如,某個IP被防火牆DNS、或ISP封鎖而阻擋了某些圖片的顯示時,透過修改hosts檔案以正常顯示圖片的方法流傳。

Windows 8與Windows 7一樣,修改Hosts文件的路徑和方法都沒變。
Hosts文件的存儲路徑為:C:\windows\system32\drivers\etc\hosts
跟Windows 7一樣Hosts文件默認是鎖定了權限的。只有管理員權限才能編輯修改Hosts文件內容,要修改Windows 8的Hosts文件可以用管理員權限開啟記事本等編輯工具,然後打開Hosts文件,修改後就可以保存了。或者是將Hosts轉存在別的空間底下,修改完成後,再複製回去到默認的路徑即可。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年11月25日 星期一

SQL Server 獨有特性

「To do a good job, one must first sharpen one's tools.」這句英文,我想大家應該都不默生。沒錯,工欲善其事,必先利其器,想要把玩T-SQL,當然就要了解它獨特的特性。讓我們來看看它的特性是怎樣的玩味。

1.不使用USING:SQL Server並不支援在連接中使用USING語句,因為會違反了標準並且是特定於SQL Server的。

2.唯一空值:SQL Server就會視所有的空值為唯一的。

3.優先空值:SQL ServerMySQL都有的特性,當在一個包含空值的欄位上使用ORDER BY時,會優先顯示,並沒有在標準中加以指定。

4.IN的限制:你不能在IN中使用多個欄位。

5.不支援LEAST GREATEST:SQL Server並不支援LEASTGREATEST,必須依賴CASE

6.BIT限制:對於Boolean,SQL Server支援一個特殊資料類型,稱之為BIT。但是,你不能在那些欄位上聚合AND或是OR(通常這些是由MAXMIN完成的)

7.相加和字元串連接的混淆:執行字元串連接與數值+都使用的是相同的操作符+ 。這可能會在數值和字串混合的情況下造成混淆。

8.不支援在嵌套中使用ORDER BY :在嵌套查詢和內聯(單查詢)表值函數中,ORDER BY並不受支援,除非在SELECT中使用TOPSQL並不保證記錄的順序,除非你用ORDER BY對其進行顯式定義。如果想要特定的順序,就在最外層查詢中加以指定。

9.Read、Write相互block:SQL ServerMySQL MyISAM都有的特性。因為ACID特性,SQL Server的鎖定系統會讓Read、Write相互block,即便它們是不同的記錄或工作也會相互block

10.函數TRIM的限制:SQL Server不讓TRIM函數來對一個字串(String)兩端的空格字元進行修整。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年11月24日 星期日

What's T-SQL

市面上有著許許多多的DB工具,筆著除了玩過MySQL,再來就是因工作而接觸的MS-SQL。當然,想要管理與操作,就一定要懂各家專屬的命令語法。筆著來小小道一下T-SQL特性和基本結構,透過官方和網路上許多前輩分享的,再加上我的經驗與匯整,集結出來的一些資訊,讓網友們能更了解它的面貌。

Transact-SQL(又稱T-SQL),是在Microsoft SQL Server和Sybase SQL Server上的ANSI SQL實作,與Oracle的PL/SQL性質相近(不只是實作ANSI SQL,也為自身資料庫系統的特性提供實作支援),目前在Microsoft SQL Server[1]和Sybase Adaptive Server[2]中仍然被使用為核心的查詢語言。
Transact-SQL是具有批次(Batch)與區塊特性(Block)的SQL指令集合,資料庫開發人員可以利用它來撰寫資料部份的商業邏輯(Data-based Business Logic),以強制限制前端應用程式對資料的控制能力。同時,它也是資料庫物件的主要開發語言。

-批次-

批次是指從應用程式同時傳送到 SQL Server 執行的一或多個 Transact-SQL 陳述式群組。

SQL Server 將批次的陳述式編譯成單一可執行單元,稱為執行計畫。然後一次執行完畢該執行計畫中的陳述式。

Transact-SQL 陳述式應該使用分號終止。

這不是強制性的需求,但是會取代不使用分號結束陳述式的功能,而且在未來版本的 Microsoft SQL Server 中可能會移除這個功能。

編譯錯誤 (例如語法錯誤) 會妨礙執行計畫的編譯。因此,不會執行批次中的任何陳述式。

--

執行階段錯誤會有下列其中一種影響:

1. 大部分的執行階段錯誤會停止目前的陳述式和批次中隨後進行的陳述式。
2. 某些執行階段錯誤 (像是強制違規) 只會停止目前的陳述式。批次中所有剩餘的陳述式都會執行。

在發生執行階段錯誤的陳述式之前執行的陳述式不受影響。
唯一的例外是如果批次在交易中,而該錯誤造成交易回復。

在這種情況下,執行階段錯誤回復之前所做的任何未認可的資料修改都會回復。

例如,假設某個批次中有 10 個陳述式。如果第五個陳述式有語法錯誤,批次中的所有陳述式都不會執行。

如果此批次已經完成編譯,但在執行第二個陳述式時失敗,因為第一個陳述式已經執行,所以其結果不受影響。

SQL Server 提供陳述式層級重新編譯。


也就是說,如果陳述式觸發重新編譯,則只有該陳述式會重新編譯,而非整個批次。此行為與 SQL Server 2000 不同。

例如:
Transact-SQL可以使用分號";"來分割不同的SQL指令。

INSERT INTO myTable (myText) VALUES (@myText); SELECT @IDENTITY

-區塊特性-


就如同程式裡的函數,運用BEGIN/END指令可以將多個T-SQL指令群組成一個邏輯區塊,在T-SQL通常是搭配流程控制指令來使用。一般來說,BEGIN/END指令的使用時機。


WHILE迴圈指令需要包含一個邏輯區塊的T-SQL指令。IF或ELSE條件指令需要包含一個邏輯區塊的T-SQL指令。CASE函數需要包含一個邏輯區塊的T-SQL指令。


BEGIN
{
    sql_statement | statement_block
}
END

簡單的說,當流程控制指令需要執行兩個或以上的T-SQL指令時,我們就需要使用BEGIN/END指令將它們括起來。如下所示:

IF @dbName = '金流系統'
BEGIN
   PRINT 'Database: CashFlow'
   PRINT 'Tables: Receipt, Expenditure'


END

BEGIN/END指令的使用時機,如下所示:
WHILE迴圈指令需要包含一個邏輯區塊的T-SQL指令。
IF或ELSE條件指令需要包含一個邏輯區塊的T-SQL指令。
CASE函數需要包含一個邏輯區塊的T-SQL指令。


-結構-


T-SQL指令碼大部分是一列指令敘述接著一列指令敘述循序的執行,但是對於複雜的工作,為了達成預期的執行結果,我們需要使用「流程控制結構」(Control Structures)來控制執行的流程。
T-SQL流程控制指令可以配合條件判斷來執行不同的指令敘述,或重複執行指令敘述。流程控制主要分為兩類,如下所示:
條件控制:條件控制是一個選擇題,可能為單一選擇或多選一,依照條件決定執行那一個指令敘述,或整個區塊的指令敘述。
迴圈控制:迴圈控制是重複執行指令敘述或整個區塊的指令敘述,擁有結束條件來結束迴圈執行。



Transact-SQL可支援下列的控制流程語法(control-flow):BEGIN ... END,標示SQL指令區塊,使用BEGIN ... END包裝的指令會被視為同一個指令區塊。


  1. IF ... ELSE的條件式,並可支援巢狀式的IF判斷式,若IF或ELSE中的指令包含兩個以上,則必須要使用BEGIN ... END來標示區塊,否則會發生語法檢查錯誤。
  2. WHILE迴圈,這也是Transact-SQL中唯一支援的迴圈,迴圈中的指令要用BEGIN...END包裝。
  3. RETURN,可強制終止區塊的執行。
  4. WAITFOR,可強制讓陳述式等待指定時間後才繼續執行。
  5. GOTO,可導向執行指令到指定的位置。
  6. CASE,執行單一值相等的比較。


IF條件控制指令可以依條件決定是否執行T-SQL指令敘述,如下所示:

IF 條件運算式
   { 指令敘述 | BEGIN END }
ELSE

   { 指令敘述 | BEGIN  END }

T-SQL語言的WHILE迴圈指令可以建立迴圈的控制結構,不只如此,對於WHILE迴圈,我們還可以使用BREAK指令跳出迴圈,或CONTINUE指令繼續迴圈的執行。
WHILE迴圈控制指令是在迴圈開頭檢查條件,開頭檢查可以判斷是否允許進入迴圈,只有當測試條件成立時才允許進入迴圈,不成立就離開迴圈,如下所示:

WHILE 條件運算式
   { 指令敘述 | BEGIN END }

RETURN指令可以中斷批次或預存程序的執行,也就是說,在此指令之後的指令敘述都不會執行,其基本語法如下所示:
RETURN [整數運算式]
上述語法的RETURN指令如果使用在預存程序,可以傳回一個整數值,如果沒有指定,預設傳回0。

CASE函數是執行單一值相等的比較,如下所示:

CASE 輸入運算式
   WHEN 比對運算式 THEN 結果運算式 […n]
   [ ELSE 例外的結果運算式 ]
END

WAITFOR指令可以暫停批次、預存程序或交易的執行,如下所示:

WAITFOR { DELAY | TIME } 時間

上述語法可以使用DELAY關鍵字來指定延遲一段時間,例如:2秒,或使用TIME關鍵字指定延遲至指定的時間,例如:下午10點。時間格式是hh:mm:ss。


GOTO指令可以變更執行流程至指定的標籤(Label),如下所示:

GOTO 標籤名稱

上述語法可以跳躍至標籤名稱的下一個指令敘述來繼續的執行。標籤的基本語法如下所示:
標籤名稱:

上述語言在標籤名稱後是一個「:」符號。GOTO指令最常見的應用是跳出巢狀迴圈,因為BREAK指令只能跳出目前這一層WHILE迴圈,如果需要跳出整個巢狀迴圈,就需要使用GOTO指令。


-自訂變數-

在Transact-SQL中,可以利用DECLARE來宣告變數,用SET來設定變數值,用SELECT @var = column的方式,由一個陳述式的回傳值中來取得變數值。

DECLARE @v INT -- 定義變數
SET @v = 50 -- 給予變數的值
SELECT @v = SUM(Qty) FROM SaleItemRecords WHERE SaleID = 53928 -- 從結果給予的變數

-錯誤處理-

Transact-SQL可以在區塊中使用下列方式來處理或引發錯誤:RAISERROR,擲出自訂的錯誤狀況。TRY ... CATCH,使用結構化的方式來處理錯誤(只有Microsoft SQL Server實作的Transact-SQL支援)。


-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年11月23日 星期六

Windows Azure - T-SQL 查詢 SQL Database和頻寬的使用量

介紹進階的技巧,如何利用 T-SQL 查詢 SQL Database 的使用量與頻寬使用量。

利用 sys.database_usage 系統檢視來查看 SQL Database 服務中資料庫發生使用量的日期、資料庫類型以及發生使用量的當天最大的資料庫單位(DU)。

select * from sys.database_usage order by [time]


利用 sys.bandwidth_usage 系統檢視來查看資料庫所使用的頻寬。
以下指令碼用來查看 SQL Database 中資料庫所使用的頻寬:

select * from sys.bandwidth_usage order by [time]




以上的查詢功能,可以讓開發者了解如何規劃DB的結構和節省成本,例如規劃盡量讓會產生較大流量的服務擺在同一個子區域,因為SQL Database Windows Azure 上的服務之間所使用的頻寬是免費的。透過一些特性,達到最好效能和最省成本的佈暑。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年11月22日 星期五

C# Design Pattern - Bridge

在軟體系統中,某些類型由於自身的邏輯,它具有兩個或多個維度的變化,開發者可以將抽象部分與實現部分分離,使它們都可以獨立的變化。

如同蠟筆一樣。紅紅綠綠的蠟筆一大盒,可以根據想像描繪出格式圖樣。但想要繪製一幅圖畫,藍天、白雲、綠樹、小鳥,如果畫面尺寸很大,那麼用蠟筆繪製就會遇到點麻煩。最好有粗粗的蠟筆很快能塗抹完成。如果一套12種顏色的蠟筆,我們需要兩套 24支,為了一幅畫,我們需要準備24支型號不同的蠟筆。
但是用毛筆就不同了,一套水彩12色,外加大小二支毛筆,畫藍天用大毛筆,畫小鳥用小毛筆,各具特色。

所以呢,Bridge模式,就是通過Bridge模式,我們把乘法運算2×1224改為了加法運算21214。然後如同蠟筆和毛筆的特色一般將抽象化 (Abstraction)與實現化(Implementation)脫耦,使得二者可以獨立地變化
蠟筆的顏色就是蠟筆的本身,但毛筆與顏料能夠脫耦而各別獨立,各自獨立變化,便簡化了操作。
蠟筆由於無法將筆與顏色分離,造成筆與顏色兩個自由度無法單獨變化,使得必須要有24種筆色才能完成任務。Bridge模式將繼承關係轉換為組合關係,從而降低了系統間的耦合,減少了程式碼編程。  

abstract class Brush
{
protected Color c;
public abstract void Paint();
public void SetColor(Color c)
{ this.c = c; }

}

建立二個類別,分別是大刷子和小刷子
class BigBrush : Brush
{
public override void Paint()
{
Console.WriteLine("Using big brush and color {0} painting", c.color);
}

}

class SmallBrush : Brush
{
public override void Paint()
{
Console.WriteLine("Using small brush and color {0} painting", c.color);
}

}

建立三種不同顏色類別
class Red : Color
{
public Red()
{ this.color = "red"; }

}

class Green : Color
{
public Green()
{ this.color = "green"; }

}

class Blue : Color
{
public Blue()
{ this.color = "blue"; }

}


不同大小的毛筆可以產生相同而不同的顏色,然後各別達到不同的功效
class Program
{
public static void Main()
{
Brush b = new BigBrush();
b.SetColor(new Red());
b.Paint();
b.SetColor(new Blue());
b.Paint();
b.SetColor(new Green());
b.Paint();

b = new SmallBrush();
b.SetColor(new Red());
b.Paint();
b.SetColor(new Blue());
b.Paint();
b.SetColor(new Green());
b.Paint();
}

}


Bridge模式使用物件間的組合關係,解耦了抽象和實現之間固有的綁定關係,使得抽象和實現可以沿著自身的維度來變化。Bridge模式較類似多繼承,但是多繼承往往違背了類別的單一職責原則,複用性比較差。Bridge模式是比多繼承更好的解決方法,所以應用一般在兩個非常強的變化維度。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手