2013年7月19日 星期五

Static Constructor vs Constructor 靜態建構式

參考:MSDN 靜態建構式
靜態建構函式可以用來初始化任何靜態資料,或執行只需執行一次的特定動作。
在建立第一個執行個體或參考任何靜態成員之前,會自動呼叫靜態建構函式。

C# Code
class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("了解Static Constructor 與Constructor");
            ForTestConstractor x = new ForTestConstractor();
            Console.ReadLine();
        }
     }

class ForTestConstractor
    {
         //static Constrator
        static ForTestConstractor()
        {
            Console.WriteLine("static Constructor");
        }
        public ForTestConstractor()
        {
            Console.WriteLine("normal Constructor");
        }
    }
執行結果:

了解Static Constructor 與Constructor
static Constructor
normal Constructor

2013年6月6日 星期四

MVC 4 AjaxBeginForm 用多重按鈕

參考文章:Handling multiple submit buttons on the same form - MVC Razor

一般使用Ajax.BeginForm會搭配Submit button觸發,
要使用多重按鈕
1.必須要指定所有按鈕都有相同的name屬性(name="btn")
2.每個按鈕賦予不同的值(value = "Create" or value = "Update" )
3.在Controller中,除了model的參數外(ModelDto XDto),
還要加上從View傳到Control 的值,參數的命名必須跟name屬性相同(string btn )
4.利用btn當作條件做判斷

--View-----------------------------------------------------------------------------------------------------
@using (Ajax.BeginForm("Create", "DIM", new AjaxOptions { HttpMethod = "POST", Confirm = "確定要變更?", UpdateTargetId = "ajaxBody" }))
{
    @Html.EditorFor(model => model.id)
    

}
--Controller------------------------------------------------------------------------------------------------
// POST: /DIM/Create
[HttpPost]
public ActionResult Create(ModelDto XDto, string btn)
{        
    if (ModelState.IsValid)
    {
        if (btn == "Create")
        {
            db.ModelDto .Add(XDto);
            db.SaveChanges();
        }
        else
        {
            db.Entry(XDto).State = EntityState.Modified;
            db.SaveChanges();
        }
    }
    return RedirectToAction("List");
}

2013年5月20日 星期一

C# .NET 修改系統時間

依賴系統時間執行不同方法的程式,
測試時可能就需要改變系統時間來確定程式是否有問題。

2013年5月14日 星期二

Oracle UT 自製Assert

參考Oracle PL/SQL 5th

Oracle沒有提供UT的元件,
所以必須要自己撰寫類似Assert的檢核機制。
ex.
PROCEDURE ASSERT (description IN VARCHAR2 , expected_value IN VARCHAR2, actual_value  IN VARCHAR2) --驗證用
IS
BEGIN
    DBMS_OUTPUT.PUT(description || ': ');
    IF expected_value = actual_value OR (expected_value IS NULL AND actual_value IS NULL) 
        THEN DBMS_OUTPUT.PUT_LINE('PASSED'); 
        ELSE DBMS_OUTPUT.PUT_LINE('FAILED. Expected ' || expected_value || '; got ' || actual_value); 
    END IF;
END;
PROCEDURE ASSERT (description IN VARCHAR2 , expected_value IN NUMBER, actual_value IN NUMBER) --驗證用
IS
BEGIN
    DBMS_OUTPUT.PUT(description || ': ');
    IF expected_value = actual_value OR (expected_value IS NULL AND actual_value IS NULL) 
        THEN DBMS_OUTPUT.PUT_LINE('PASSED'); 
        ELSE DBMS_OUTPUT.PUT_LINE('FAILED. Expected ' || expected_value || '; got ' || actual_value); 
    END IF;
END;
-------------------------------
<!--more>
所以UT的撰寫時,可以獨立的把上述兩個Procedure撰寫在oracle中,
或者可以直接寫在Declare裡。
ex.
Declare
    A number;--預計資料筆數
    B number;--實際資料筆數(從table撈)
    PROCEDURE ASSERT (description IN VARCHAR2 , expected_value IN VARCHAR2, actual_value  IN VARCHAR2) --驗證用
    IS
    BEGIN
        DBMS_OUTPUT.PUT(description || ': ');
        IF expected_value = actual_value OR (expected_value IS NULL AND actual_value IS NULL) 
            THEN DBMS_OUTPUT.PUT_LINE('PASSED'); 
            ELSE DBMS_OUTPUT.PUT_LINE('FAILED. Expected ' || expected_value || '; got ' || actual_value); 
        END IF;
    END;
    PROCEDURE ASSERT (description IN VARCHAR2 , expected_value IN NUMBER, actual_value IN NUMBER) --驗證用
    IS
    BEGIN
        DBMS_OUTPUT.PUT(description || ': ');
        IF expected_value = actual_value OR (expected_value IS NULL AND actual_value IS NULL) 
            THEN DBMS_OUTPUT.PUT_LINE('PASSED'); 
            ELSE DBMS_OUTPUT.PUT_LINE('FAILED. Expected ' || expected_value || '; got ' || actual_value); 
        END IF;
    END;

BEGIN
       A : =10;(預計10筆)
       SELECT Count(*) INTO B FROM table;
       ASSERT('筆數檢核:',A,B) ;
END;
------------------------------------------------------------------------------------------------
結果(DBMS_OUTPUT):
通過→
筆數檢核:PASSED
失敗→
筆數檢核:FAILED. Expected : 10 ;got 9

2013年5月7日 星期二

2013年5月3日 星期五

2013年4月30日 星期二

使用DBMS_UTILITY.format_error_backtrace

DBMS_UTILITY.format_error_backtrace

For Oracle 10g以上的EXCEPTION TRACE~

Sample from book :
------------------------PK spec-----------------------------
CREATE OR REPLACE PACKAGE EEP.ERRORTEST
AS
    PROCEDURE proc1;
    PROCEDURE proc2;
    PROCEDURE proc3;
END;