維祥's profile焗烤蝦米工坊PhotosBlogLists Tools Help

焗烤蝦米工坊

非工商服務網頁,單純個人知識庫,有錯誤歡迎您來信指正,謝謝。

維祥 林

Photo 1 of 11
常用的Open Source資源
February 11

Visual Studio Hacks - Debugging

Hack 37-Troubleshoot Breakpoints

透過線上的web可以判斷為何中斷點無法正常運作?

透過下方的網址,可以進入到測試的網站。

http://www.controlav.com/bphelper

請注意!!! 這個只有支援 VS2002 VS2003 VS2005的版本。

Visual Studio Hacks - Debugging

Hack36-Set Breakpoints

除了按下畫面左方的空白的地方,也可以在程式碼的左方點選,即可設置中斷點。(請參考下方圖示)

setBreakpoints

也可按下快捷鍵 (F9) 在游標所在的程式碼上立即設置中斷點。

如果要針對中斷點做進一步的設定,則可以在 偵錯-> 建立新中斷, 開啟”建立新中斷點的對話方塊”。快捷鍵 (Ctrl - B) 。你可以在對話方塊中只輸入函式名稱,VS會自動將專案中每個類別裡符合的函式列表出來讓你勾選。

在偵錯模式時,可以在 偵錯 –> 視窗 –> 呼叫堆疊(Call Stack),開啟呼叫堆疊式窗,可以直接在想要的中斷的函式名稱上方案下滑鼠右鍵,開啟相關的功能。這個方法在偵錯有使用遞迴(Recursive)函式的時候相當好用。

可以在 偵錯 -> 視窗 -> 中斷點,開啟中斷點視窗,會顯示目前所有的中斷點列表。快捷鍵 (Ctrl – Alt - B)

設定中斷點的條件,可以直接使用判斷式(可搭配 || , && , + , -),判斷式中的變數名稱可以使用程式中所包含的變數名稱。

也可以根據呼叫次數來當作中斷的條件。

November 07

解決每個頁面都要初始化 特定物件 (如連線物件) 的做法

最近在幫網頁專案設計ORM架構,不過協助設計的同事反映說,每次要使用ORM物件前都要先建立SQL連線物件,如果忘記建立,程式就會錯OTZ
不過老實說,我也覺得這樣很瞎,因此經過思考與測試後,發現此做法即可免除掉每個頁面要使用前都必須要建立SQL連線字串

 

主要是先建立一個靜態類別,利用屬性的方式,將所傳入SQL連線物件儲存到Application變數中

 

1.先建立一個靜態類別,可直接執行相關函式。

public static class DataControler
{
        public static System.Data.SqlClient.SqlConnection conn
        {
            get
            {
                if (System.Web.HttpContext.Current.Application["CONN"] == null || System.Web.HttpContext.Current.Application["CONN"].Equals(String.Empty))
                    throw new Exception("注意!! 無法抓取到儲存到Application變數 SqlConnection!! 物件");
                else
                    return (System.Data.SqlClient.SqlConnection) System.Web.HttpContext.Current.Application["CONN"];
            }
            set
            {
                System.Web.HttpContext.Current.Application["CONN"] = value;
            }
        }

}

 

2.在Global.asax的檔案中,找到下列的函式,增加下列的內容。

void Application_Start(object sender, EventArgs e)
   {
       // 應用程式啟動時執行的程式碼
       Aurora.Web.Module.Manage.DataControler.conn = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["TestConnString"].ConnectionString);
   }

3.之後要使用頁面使用,直接存取 DataControler.conn 即可(可在其他頁面中加入下列的程式碼來測試)

Response.Write(DataControler.conn.ConnectionString);

October 31

如何讓圖片利用CSS垂直置中

之前的美工所遇到的問題,他苦惱了很久,後來她自行在網路上找到相關文章,感覺是很常會遇到的問題,特此收錄在此

http://www.phontol.com/20080727_257372.html

 

文章內容備份:

 

完美的水平垂直居中!!--兼容ie6,ie7,ff,opera,safari的水平垂直居中
点击下面的运行,可预览代码效果:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>完美的水平垂直居中!!--兼容ie6,ie7,ff,opera,safari的水平垂直居中</title> <style media="screen" type="text/css"> .wrapper{ width:700px; height:400px; background:#ccc; border:1px #000 solid;} .holder{width:500px; height:200px; display:table; position:relative; margin:12px auto; border:1px solid #596480; background:#ffc;} .holder div{*position:absolute; top:50%; left:0; display:table-cell; vertical-align:middle; width:100%;} .holder p{position: relative; top:-50%; text-align:center; margin:0; padding:0;} /* 分两套看 holder的 display:table holder div的 display:table-cell; vertical-align:middle; 就可以实现在ff,safari和opera下的垂直居中,但是对ie系列无效 holder的 position:relative; holder div的 *position:absolute; top:50%; left:0; .holder p的 position: relative; top:-50%; 通过控制绝对层的位置实现ie6,7下的垂直居中 holder div中的*position:absolute是只给ie6和7看的css hack 对于水平居中要说的是如果holder div的width如果未指明100%,在ie7中它是不会自动延伸100%的,也就无法实现水平居中 */ </style> </head> <body> <div class="wrapper"> <div class="holder"> <div><p><img src="http://webdesign.bitscn.com/UploadFiles_8014/200803/20080311145849892.gif" /></p></div> </div> <div style="line-height:40px; background:#006633; font-size:14px; color:#FFFFFF; font-weight:bold; text-align:center;"> 以上的图片垂直并且水平居中,您可以改变holder的height和width进行测试</div> </div> </body> </html>

October 22

頁面出現 <pages enableEventValidation="true"/> 的相關訊息,發生原因

今天在整理以前寫的程式,出現了下列的錯誤!!

無效的回傳或回呼引數。已在組態中使用 <pages enableEventValidation="true"/> 或在網頁中使用 <%@ Page EnableEventValidation="true" %> 啟用事件驗證。基於安全性理由,這項功能驗證回傳或回呼引數是來自原本呈現它們的伺服器控制項。如果資料為有效並且是必需的,請使用 ClientScriptManager.RegisterForEventValidation 方法註冊回傳或回呼資料,以進行驗證。
描述: 在執行目前 Web 要求的過程中發生未處理的例外情形。請檢閱堆疊追蹤以取得錯誤的詳細資訊,以及在程式碼中產生的位置。
例外詳細資訊: System.ArgumentException: 無效的回傳或回呼引數。已在組態中使用 <pages enableEventValidation="true"/> 或在網頁中使用 <%@ Page EnableEventValidation="true" %> 啟用事件驗證。基於安全性理由,這項功能驗證回傳或回呼引數是來自原本呈現它們的伺服器控制項。如果資料為有效並且是必需的,請使用 ClientScriptManager.RegisterForEventValidation 方法註冊回傳或回呼資料,以進行驗證。

 

第一次看還真的有看沒有懂 OTZ,後來在藍色小舖找到一篇文章:不知怎麼個...出現... "無效的回傳或回呼引數" orz... 該怎麼處置... ~>"<~

 

文章中說明,我在Web組態中開啟了 <pages enableEventValidation="true"/> 選項,導致有被註冊的控制項才能回傳資料,避免使用者張貼惡意訊息。

原來的程式是使用 .NET 1.1 開發的 再加上我有在自定的User control 使用下列的函式

public void MakeConfirmWindow(string msg)
        {
            JavaScriptString = "var _" + this.UniqueID + "_a;";
            JavaScriptString += "_" +this.UniqueID + "_a=window.confirm('" + msg + "');";
            JavaScriptString += "Form1." + this.Hidden1.ClientID + ".value=_" + this.UniqueID + "_a;";
            JavaScriptString += "Form1.submit();";
        }

 

然後在POSTBACK 的事件中 有抓取該Hidden1控制項的值。

//抓取網頁上分頁控制項
            PageBar_Link page_bar = (PageBar_Link) Page.FindControl("PageBar_Link1");
            doJavaScript JS = (doJavaScript) this.FindControl("DoJavaScript1");
            JS.SetPosition(this);

            // 在這裡放置使用者程式碼以初始化網頁
            if(Page.IsPostBack)
            {
                //抓取是否為取消按鍵所觸發的PostBack,如果是就清除狀態

                if(JS.ConfirmWindowValue != "")
                {
                    if(JS.ConfirmWindowValue == "true")
                        Delete(ViewState["Del_ID"].ToString());        //執行刪除
                    //清除刪除ID的ViewState變數與JS回傳狀態
                    ViewState["Del_ID"]="";
                    JS.ConfirmWindowValue="";

                    panForm.Visible = false;
                }
            }

開起子視窗且將子視窗的值傳回給父視窗

運作原理:

父視窗:

根據所傳入父視窗控制項,抓取該控制項的ClientID,並儲存到Session中。

子視窗:

確定要將值傳回給父視窗時,讀取儲存在Session中要傳回到在父視窗控制項的ClientID,然後動態建立Javascript語法,並直接在網頁上執行。

Source Code:

Sample Code:

October 21

中華民國身分證字號驗證

字母對照表 的對照資料下載:

建立表格後,將資料匯入到該表格內

字母對照表 表格結構

----------------------------------------------------------------------------------------------

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tb_ValidPersonID_LetterToNumber](
    [Letter] [varchar](1) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL,
    [Number] [int] NOT NULL,
CONSTRAINT [PK_tb_ValidPersonID_LetterToNumber] PRIMARY KEY CLUSTERED
(
    [Letter] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字母' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tb_ValidPersonID_LetterToNumber', @level2type=N'COLUMN', @level2name=N'Letter'

GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'數字' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'tb_ValidPersonID_LetterToNumber', @level2type=N'COLUMN', @level2name=N'Number'

 

身分證字號驗證函式

----------------------------------------------------------------------------------------------

-- =============================================
-- Author:        林維祥
-- Create date: 2008/10/20
-- Description:    驗證身分證字號的正確性 會參考 (tb_ValidPersonID_LetterToNumber) 的表格
-- TEST:        SELECT dbo.fn_ValidPersonalID('A123456786')
-- =============================================

--================流程=====================
/*
5. 判斷所輸入長度是否滿足10個字元
    5.1 不滿足10個字元
    5.2 回傳0
10. 取得第一個字母的所對應的數字
    10.1 無法取得
    10.2 回傳0
15. 針對所對應的個位數數字乘以9,在加上十位數字,其總和再除以10取得餘數
16. 判斷第二個字元是否為字母
    16.1 取得該字母所對應數字的個位數
17. 第二個字元不是字母,將第二個字元直接轉成數字
20. 產生一組10個位數的數列,將數列中的數字依序乘上 1、8、7、6、5、4、3、2'1,後加總起來
25. 將加總後的數字除以10,取餘數
30. 取餘數之補數
31. 如果餘數為0,直接將該補數設為0
35. 判斷餘數的補數是否與檢查碼(身分證字號最後一位數字)相同
    35.1 餘數的補數是否與檢查碼(身分證字號最後一位數字)不相同
    35.2 回傳0
40. 回傳 1
*/
--=========================================
ALTER FUNCTION fn_ValidPersonalID
(
    @PID AS varchar(10)

)
RETURNS bit
AS
BEGIN
    --宣告第一個自願到第十個字元所對應的數字
    DECLARE @L1 AS tinyint
    SET @L1=NULL
    DECLARE @L2 AS tinyint
    SET @L2=NULL
    DECLARE @L3 AS tinyint
    SET @L3=NULL
    DECLARE @L4 AS tinyint
    SET @L4=NULL
    DECLARE @L5 AS tinyint
    SET @L5=NULL
    DECLARE @L6 AS tinyint
    SET @L6=NULL
    DECLARE @L7 AS tinyint
    SET @L7=NULL
    DECLARE @L8 AS tinyint
    SET @L8=NULL
    DECLARE @L9 AS tinyint
    SET @L9=NULL
    DECLARE @L10 AS tinyint
    SET @L10=NULL

    --5. 判斷所輸入長度是否滿足10個字元
    IF(LEN(@PID) < 10)
    BEGIN
    --5.1 不滿足10個字元
        --5.2 回傳0
        return 0
    END
    --10. 取得第一個字母的所對應的數字
    SET @L1 = (SELECT Number
                FROM dbo.tb_ValidPersonID_LetterToNumber
                WHERE Letter=UPPER(SUBSTRING(@PID, 1, 1))
                )
    --10.1 無法取得
    IF(@L1 IS NULL)
    BEGIN
        --10.2 回傳0
        return 0
    END
    --15. 針對所對應的個位數數字乘以9,在加上十位數字,其總和再除以10取得餘數
    SET @L1 =( (@L1*9) + (@L1/10) ) % 10
    --16. 判斷第二個字元是否為字母
    SET @L2 = (SELECT Number
                FROM dbo.tb_ValidPersonID_LetterToNumber
                WHERE Letter=UPPER(SUBSTRING(@PID, 2, 1))
                )
    IF(@L2 IS NOT NULL)
    BEGIN
        --16.1 取得該字母所對應數字的個位數
        SET @L2 = @L2 % 10
    END
    ELSE
    BEGIN
        --17. 第二個字元不是字母,將第二個字元直接轉成數字
        SET @L2=CONVERT(tinyint, SUBSTRING(@PID, 2, 1))
    END

    --20. 產生一組10個位數的數列,將數列中的數字依序乘上 1、8、7、6、5、4、3、2'1,後加總起來   
    SET @L3 = CONVERT(tinyint, SUBSTRING(@PID, 3, 1))
    SET @L4 = CONVERT(tinyint, SUBSTRING(@PID, 4, 1))
    SET @L5 = CONVERT(tinyint, SUBSTRING(@PID, 5, 1))
    SET @L6 = CONVERT(tinyint, SUBSTRING(@PID, 6, 1))
    SET @L7 = CONVERT(tinyint, SUBSTRING(@PID, 7, 1))
    SET @L8 = CONVERT(tinyint, SUBSTRING(@PID, 8, 1))
    SET @L9 = CONVERT(tinyint, SUBSTRING(@PID, 9, 1))
    --檢查碼
    SET @L10 = CONVERT(tinyint, SUBSTRING(@PID, 10, 1))

    DECLARE @Sum AS int
    SET @Sum = (@L1*1) + (@L2*8) + (@L3*7) + (@L4*6) + (@L5*5) + (@L6*4) + (@L7*3) + (@L8*2) + (@L9*1)
    DECLARE @TransCode AS int
    --25. 將加總後的數字除以10,取餘數
    SET @TransCode = @Sum % 10
    --30. 取餘數之補數
    SET    @TransCode = 10 - @TransCode
    --31. 如果餘數為0,直接將該補數設為0
    IF(@TransCode = 10)
        SET @TransCode=0   

    --35. 判斷餘數的補數是否與檢查碼(身分證字號最後一位數字)相同
    IF(@TransCode != @L10)
    BEGIN
    --35.1 餘數的補數是否與檢查碼(身分證字號最後一位數字)不相同
        --35.2 回傳0
        return 0
    END
    ELSE
    BEGIN
        --40. 回傳 1
        return 1
    END
    Return 0
END
GO

 
LINQ 相關資料資源
by