2011年6月14日火曜日

[C#]サービス作成時、デバッグするときにデバッガを立ち上げる。

C#でWindowsサービスを作成するにあたって、ステップ実行でのデバッグがしたかったので、以下のようにちょっと工夫をしてみた。
Debugモードでビルドされているときに限り、デバッガ選択画面を立ち上がり、アタッチできます。

  1. /// <summary>  
  2. /// サービス起動  
  3. /// </summary>  
  4. /// <param name="args"></param>  
  5. protected override void OnStart(string[] args)  
  6. {  
  7.     //デバッグ時のみデバッガを起動します。  
  8.     DebuggingProcess();  
  9.   
  10.     //以降サービス起動時に行う処理  
  11. }  
  12.   
  13. /// <summary>  
  14. /// [デバッグ属性メソッド]デバッガ起動  
  15. /// </summary>  
  16. [Conditional("DEBUG")]  
  17. private void DebuggingProcess()  
  18. {  
  19.     System.Diagnostics.Debugger.Launch();  
  20. }  

メソッドにデバッグ時のみ実行される属性を付けます。
  1. [Conditional("DEBUG")]  

この属性の付いたメソッドは、Relaseモードで実行された場合には実行されません。
処理自体空振りします。

実行すると、デバッガはどれでデバッグしますか?的なウィンドウが現れ、指定したツールでアタッチできます。
ビルドしてインストールしてサービス立ち上げてデバッガ立ち上げてなんて…サービスのデバッグはホント面倒ですね。

2011年6月9日木曜日

[SQL Server]ANSI_NULLSオプションを取得する。

SQL Serverでは、NULL値との演算は常にNULL値が返ってきます。
WHERE句などでのNULL値との比較も必ずFALSEが返ります。

ANSI_NULLSオプションは、WHERE句などでNULLとの比較を成立させるかどうかを指定できます。
下のT-SQLでNULL値との比較がTRUEかどうかでANSI_NULLSオプションを取得します。

  1. DECLARE @NULL_VALUE AS bit   
  2. SET @NULL_VALUE = NULL   
  3.   
  4. IF NOT EXISTS(  
  5.     SELECT  
  6.         'ANSI_NULLS = OFF'  
  7.     WHERE  
  8.         @NULL_VALUE = NULL  
  9. )   
  10. BEGIN   
  11.     SELECT 'ON' AS [ANSI_NULLS_OPTION]   
  12. END   
  13. ELSE   
  14. BEGIN   
  15.     SELECT 'OFF' AS [ANSI_NULLS_OPTION]   
  16. END   

ただし、今後のSQL Serverでは、ANSI_NULLSは常にONとなり、
SET ANSI_NULLS OFF を設定するアプリケーションすべてでエラーが発生するようになってしまうそうです。

NULL値との条件指定をする時は必ず" IS NULL "を使うのがベストです。

詳細は下記URLを参照のこと。
SET ANSI_NULLS (Transact-SQL)
http://technet.microsoft.com/ja-jp/library/ms188048.aspx

ちょっと考えればわかるようなことを真顔で書くのが私です。

2011年6月8日水曜日

T-SQLでキャッシュクリアするには…

DBCC使うんです。
同じセッションでクエリの実行速度判定をしたい場合とかは、キャッシュクリアしたほうが正確な測定ができます。
最近のSQL Serverは頭が良くて困るね(いい意味で
  1. DBCC DROPCLEANBUFFERS  
  2. DBCC FREEPROCCACHE