2011年6月14日火曜日

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

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

/// <summary>
/// サービス起動
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
    //デバッグ時のみデバッガを起動します。
    DebuggingProcess();

    //以降サービス起動時に行う処理
}

/// <summary>
/// [デバッグ属性メソッド]デバッガ起動
/// </summary>
[Conditional("DEBUG")]
private void DebuggingProcess()
{
    System.Diagnostics.Debugger.Launch();
}

メソッドにデバッグ時のみ実行される属性を付けます。
[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オプションを取得します。

DECLARE @NULL_VALUE AS bit 
SET @NULL_VALUE = NULL 

IF NOT EXISTS(
    SELECT
        'ANSI_NULLS = OFF'
    WHERE
        @NULL_VALUE = NULL
) 
BEGIN 
    SELECT 'ON' AS [ANSI_NULLS_OPTION] 
END 
ELSE 
BEGIN 
    SELECT 'OFF' AS [ANSI_NULLS_OPTION] 
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は頭が良くて困るね(いい意味で
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE