熱門文章

2011年8月2日 星期二

Visual Studio 中好用的除錯技巧與快捷鍵

Visual Studio 的除錯技巧,想必用Windows開發工具寫程式的同好們再熟悉不過了...

不過今天在網路上瀏覽到一篇文章寫的還蠻詳細的

在此分享一下


除錯的輔助功能

我們都知道按下 F5 可以啟動或繼續除錯的動作, 但你或許不知道按下 Shift-F5 (Stop Debugging) 可以停止除錯, 並且立即回到設計畫面。此外, 按下 Ctrl-Shift-F5 (Restart) 可以重新啟動除錯, 這在我們修改程式碼之後的繼續除錯很有幫助。
在設定程式的中斷點之後, 我們可以按下 F10 或 F11 以逐步執行的方式來觀察每一行程式的執行結果。其中 F10 和 F11 都是讓你一行一行的往下執行, 其差異在於按下 F10 時, 畫面並不會切換到中斷行所呼叫的函式。例如你的程式中有一個方法叫做 protected int calc(int a, int b), 如果中斷點執行到這個方法時, 例如 int result = calc(100, 200); 此時如果按下 F10 (Step Over), 畫面只會繼續進行到該行的下一行 (這時候你可以把滑鼠游標移到 result 這個變數上面, 就可以看到 calc() 方法所傳回的結果); 但是如果剛才你按的是 F11 (Step Into) 而不是 F10, 那麼畫面會跳進 calc() 方法裡面, 那麼會變成你是在檢查 calc() 方法中的程式了。
在這個情況下, 如果你剛才按的是 F11, 畫面切入 calc() 方法, 而偏偏 calc() 方法又臭又長, 但你卻已經不想在 calc() 方法中浪費時間了, 怎麼辦? 很簡單, 你可以立刻按下 Shift-F11 (Step Out), 它會讓你直接從目前的函式中跳回上一層, 然後再繼續。
我個人覺得上面所提的三個按鍵幾乎已經是我日常工作中對於除錯功能的全部需求了。不過我的一位同事很喜歡使用 Watch 功能; 如果你有需要同時監看多個變數, 或許你也可以參考他的習慣做法。方法很簡單, 你可以在除錯階段中, 在變數上面按下滑鼠右鍵, 再選擇 Add Watch, 之後這個變數就會在監看視窗中列出來, 供你在逐步除錯時快速監看各個變數的變化值。不過這個功能有個缺點, 就是你時常需要以手動方式把 Watch 刪除, 否則監看視窗很快就會擠滿一大堆東西。
此外, 我個人蠻喜歡逐步執行和「繼續」混合運用的除錯方式。由於你可以很自由的在除錯時期加入和取消中斷點, 所以你可以視情況在適當的地方加入新的中斷點, 然後按下 F5 (Continue), 讓程式直接執行到新中斷點所在。你也可以在程式迴圈裡的適當地點加入中斷點, 然後按下 F5, 那麼程式會立即執行到迴圈的下一個回合。等你檢查得差不多的時候, 把迴圈內的中斷點取消, 再設定其它的中斷點, 再按下 F5, 程式又會執行到其它地方 (當然, 你也可以按下滑鼠右鍵, 再選擇「執行到游標處」; 看哪一種適合你的情況)。

2011年3月15日 星期二

[MSSQL] BEGIN TRY ... CATCH

在Stored Procedures裡面加上 BEGIN TRY ... CATCH,從中加上交易控制,若發生錯誤就返回並丟出錯誤訊息。

具體寫法

BEGIN TRY

write your code...

END TRY

BEGIN CATCH

END CATCH

但在實際應用上,我會顯示錯誤訊息並發送E-MAIL給相關聯絡人...

BEGIN TRY

BEGIN TRAN

BEGIN

Write your code...

COMMIT TRAN

END

END TRY

BEGIN CATCH

ROLLBACK TRAN
SET @strERROR = 'Error Code: '+CONVERT(VARCHAR(20),ERROR_NUMBER()) + CHAR(13) + 'Error Message: ' + ERROR_MESSAGE()
SET @SPFLAG = 'N';
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'DB_NAME',
@RECIPIENTS= 'EMAIL_ADDRESS1;EMAIL_ADDRESS2',
                 @SUBJECT='Error_Message',
@BODY = @strERROR,
@body_format = 'HTML' ;
END CATCH

2011年3月14日 星期一

MCITP Database Developer 2008

繼去年考到MCTS Database Development 2008之後,想說做這行多學一些,並趁年輕時考取些Licenses。

接觸MSSQL SERVER 2008也已經有一段時間,工作上做了些SSIS、SSAS、SSRS的應用...

在大公司做BI需有一定的深度和經驗,往後會再多花時間繼續研究!

今年初花了些時間做Lab,考到MCITP Database Developer 2008 and Business Intelligence Developer 2008,如下圖

For Front-end Web Developers

在國外網站意外發現一篇實用的連結文章, 在此分享~


看來做WEB前端的工程師越來越幸福了...
http://sixrevisions.com/resources/cheat_sheets_web_developer/

2011年2月25日 星期五

[MSSQL] 關於SQL排序


SELECT * FROM TEMPTABLE ORDER BY 1
按查詢中的第一列排序,默認用ASC
SELECT * FROM TEMPTABLE ORDER BY 1,2
以此類推,按查詢中的第一、二列排序

2011年2月24日 星期四

[MSSQL] 撈出Table Schema

今天工作上剛好有用到, 做個小筆記

只撈出整個Table Schema, 不撈出全部資料

example

select * into temptable from XXX where 1=0

where 1=0 等於條件永遠不成立

另外

where 1=1 等於條件永遠成立

select * from XXX and where1=1

2011年2月19日 星期六

Miscrosoft MCPD 考試系列

分享給要考Microsoft MCPD的同好們!

Microsoft Visual Studio 2008

MCPD: Windows Developer 3.5 (70-536,70-505,70-563)

MCPD: Web Developer 3.5 (70-536,70-562,70-564)

MCPD: Enterprise Application Developer 3.5 (70-536,70-505,70-562,70-561,70-503,70-565)


Microsoft Visual Studio 2010

MCPD: Windows Developer 4 (70-511,70-513,70-516,70-518)

MCPD: Web Developer 4 (70-515,70-513,70-516,70-519)


Windows Azure

MCPD: Windows Azure Developer 4 (70-511 or 70-515,70-513,70-516,70-583)




2010年10月4日 星期一

Oracle 11g認證考試 OCA升級OCP方法

分享給想要考Oracle OCP 11g的同好們

獲得11g OCA認證考試方法:(需要兩科考試)

方法一:1z0-007 + 1z0-052

方法二:1z0-051 + 1z0-052

方法三:1z0-047 + 1z0-052



獲得11g OCP認證考試方法:(三科考試+ 一科原廠課程)

方法一:OCA(1z0-007 + 1z0-052) + 1z0-053 + 一科原廠課程

1z0-007 Introduction to Oracle9i: SQL

1z0-052 Oracle Database 11g: Administration I

1z0-053 Oracle Database 11g: Administration II


方法二:OCA(1z0-051 + 1z0-052) + 1z0-053 +一科原廠課程

1z0-051 Oracle Database 11g: SQL Fundamentals I

1z0-052 Oracle Database 11g: Administration I

1z0-053 Oracle Database 11g: Administration II


方法三:OCA(1z0-047 + 1z0-052) + 1z0-053 +一科原廠課程

1z0-047 Oracle Database SQL Expert

1z0-052 Oracle Database 11g: Administration I

1z0-053 Oracle Database 11g: Administration II





From
http://blog.itcert.org/archives/1743

2010年8月24日 星期二

超好用的畫流程圖軟體!

最近要畫流程圖、UML,總是用Visio畫

但覺得還是沒有很方便

發現到一款Diagram Designer,非常好用

下載位址:
http://logicnet.dk/DiagramDesigner/


我想會漸漸愛上它,真酷!

2010年8月11日 星期三

Microsoft Chart Controls for .NET 3.5

以下我整理出一些相關的連結供各位參考、下載:


Samples Environment for Microsoft Chart Controls
http://code.msdn.microsoft.com/mschart


MSDN Fourms - Chart Controls for .NET Framework
http://social.msdn.microsoft.com/Forums/en-US/MSWinWebChart/threads/


Alex Gorev's Weblog - Microsoft Chart Control
http://blogs.msdn.com/alexgor/archive/tags/Microsoft+Chart+Control/default.aspx


New ASP.NET Charting Control:
http://weblogs.asp.net/scottgu/archive/2008/11/24/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot-gt.aspx


Dundas Chart for ASP.NET - Online Document (微軟就是買下這家所出的Chart Control...所以線上文件也可以用來作參考)
http://support.dundas.com/OnlineDocumentation/WebChart2005/webframe.html


介紹好用元件:Microsoft Chart Controls for .NET 3.5 (保哥的blog中有詳細介紹需要下載安裝的說明)
http://blog.miniasp.com/post/2008/10/Useful-aspnet-and-winform-charting-control-from-Microsoft.aspx


瓶水相逢.Net - 繪圖的新利器 - Microsoft Chart Controls for .NET Framework 3.5
http://www.dotblogs.com.tw/chhuang/archive/2008/10/26/5776.aspx

jQuery Chart Plug-in-Highcharts

最近發現一個漂亮的jQuery報表Plug-in
http://www.highcharts.com/

沒想到到在client端也可以這樣做... 真是越來越強大了

2010年7月29日 星期四

MSSQL 修改欄位名稱和資料型態

若要更改某個table內的某一個欄位的型態

For example:
A1 varchar(10)  ---->  A1 varchar(20)
A2 tinyint   ----->   B2 int
第一個只改變欄位的長度或是型態
第二個改變名稱或是改變名稱與型態

解法如下:
以下說明,以 SQL Server 2008 為主:
關於第一個問題,可以使用 ALTER TABLE 陳述式:
CREATE TABLE 我的資料表 (欄位A varchar(10));
GO
ALTER TABLE 我的資料表 ALTER COLUMN 欄位A nvarchar(25) NOT NULL;
GO
ALTER TABLE 我的資料表 ALTER COLUMN 欄位A varchar(50) NULL;
GO

若僅是更改欄位名稱,請使用 sp_rename 這個預存程序,如下所示即是一例:
EXEC sp_rename '我的資料表.欄位A', '新欄位', 'COLUMN';
GO

若要更改欄位名稱與型態,就需要分成兩道指令來進行,比方說:先使用一道指令來更改欄位名稱,然後再使用第二道指令來更改欄位型態

For example:
EXEC sp_rename '我的資料表.欄位A', '新欄位', 'COLUMN';
ALTER TABLE 我的資料表 ALTER COLUMN 新欄位 nvarchar(50) NULL;
GO
刪除這個資料表:
DROP TABLE 我的資料表;
GO

2010年7月22日 星期四

MSSQL Cursor 範例


--定義一個cursor 來自指定資料表內容
DECLARE MY_CURSOR Cursor FOR
SELECT cy_closeRate,Currencycode From [Currency_rate]
WHERE cy_closeTime > DATEADD(Day,-2,getdate())
--開啟cursor
Open MY_CURSOR
--定義cursor裡要取出的物件
DECLARE @closeRate FLOAT, @cyID VARCHAR(50)

--進入cursor
Fetch NEXT FROM MY_CURSOR INTO @closeRate, @cyID
--當陳述式失敗,或資料列超出結果集時停止迴圈
While (@@FETCH_STATUS <> -1)
BEGIN
--偵錯或加入要應用的程式碼
--PRINT CONVERT(VARCHAR(100),@closeRate) +'--'+ @cyID
--再到下個指標去
FETCH NEXT FROM MY_CURSOR INTO @closeRate, @cyID
END
--關閉cursor
CLOSE MY_CURSOR
--釋放cursor
DEALLOCATE MY_CURSOR
GO

2010年7月18日 星期日

Using Parameters with an SQL IN Clause

在我前面的文章有提到 WHERE IN () 帶多值的問題,今天看到一篇國外的文章寫到,和大家一起分享

Using parameters can be a bit tricky with an IN clause though, e.g.

SELECT * FROM MyTable WHERE ID IN (3, 10, 17)


As an example, assume you have a ListBox containing possible field values. If the user can select zero, one or more of the items in the list to filter the results you could do this:


SqlConnection connection = new SqlConnection("connection string here");
SqlCommand command = new SqlCommand();
StringBuilder query = new StringBuilder("SELECT * FROM MyTable");

switch (this.listBox1.SelectedItems.Count)
{
case 0:
break;

case 1:
query.Append(" WHERE MyColumn = @MyColumn");
command.Parameters.AddWithValue("@MyColumn", this.listBox1.SelectedItem);
break;

default:
query.Append(" WHERE MyColumn IN (");
string paramName;

for (int index = 0; index < this.listBox1.SelectedItems.Count; index++) { paramName = "@MyColumn" + index.ToString(); if (index > 0)
{
query.Append(", ");
}

query.Append(paramName);
command.Parameters.AddWithValue(paramName, this.listBox1.SelectedItems[index]);
}
query.Append(")");
break;
}

command.CommandText = query.ToString();
command.Connection = connection;


上面是VB的語法,我下一篇會分享實作過的C#語法。

Primary Key 和 Unique Index

1.
Primary Key = Unique Index + Not null,
若只是 Unique Index 欄位, 則可以為 null.

2.
Table 之中, 最多只有一個 Primary Key, 但能擁有多個 Unique Index
NOT NULL = 設定該欄立不可含Null 值
UNIQUE = 設定一個或多個欄位組合,資料內容需唯一不可重覆
PRIMARY = KEY 設定資料表格不可重覆、空白或為Null的主鍵值
FOREIGN = KEY 設定該欄位值的存在必須關連並參照指定資料表格的欄位值

P.S. 基本概念的整理

MSSQL 清除 LOG 並縮減空間的語法

一般時候我們都用以下的語法進行清理

DUMP TRANSACTION {DBName} WITH NO_LOG


可是實體的檔案大小卻不會減少,一樣佔用那麼多的硬碟空間。

SET NOCOUNT ON DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INT

USE {DBName ex HRMS} -- 要操作的資料庫名
SELECT
@LogicalFileName = '{Log file name ex HRMS_Log}', -- 日誌文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log. (M)
@NewSize = 1 -- 你想設定的日誌文件的大小(M)

-- Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size FROM sysfiles WHERE name = @LogicalFileName

SELECT 'Original Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
FROM sysfiles WHERE name = @LogicalFileName

CREATE TABLE DummyTrans (DummyColumn char (8000) not null)

DECLARE @Counter INT, @StartTime DATETIME, @TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(), @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'

DBCC SHRINKFILE (@LogicalFileName, @NewSize)

EXEC (@TruncLog)

-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN -- Outer loop.
SELECT @Counter = 0
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) BEGIN -- update INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans SELECT @Counter = @Counter + 1 END EXEC (@TruncLog) END SELECT 'Final Size of ' + db_name() + ' LOG is ' + CONVERT(VARCHAR(30),size) + ' 8K pages or ' + CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' FROM sysfiles WHERE name = @LogicalFileName DROP TABLE DummyTrans SET NOCOUNT OFF


更簡潔的寫法

USE [@DBName]
BACKUP LOG [@DBName] WITH TRUNCATE_ONLY
DBCC SHRINKFILE (@LogicalFileName, @NewSize)

MSSQL T-SQL迴圈寫法


DECLARE @_i INT
DECLARE @_MAX INT
SET @_i = 0
SET @_MAX = 10 -- 要產生幾筆資料
WHILE (@_i<@_MAX) BEGIN --要迴圈的語法 INSERT INTO #TT VALUES('T') --加1 Set @_i=@_i+1 END