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

2011年4月30日土曜日

Adobe Acrobat か Reader の実行ファイルパスをレジストリから取得する

PDFファイルを印刷したいという要望があり、それの補助用メソッドです。

public static string GetPdfViewerPath()
{
    string path = String.Empty;
    Microsoft.Win32.RegistryKey rKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Acrobat.exe");
    if (rKey == null) rKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AcroRd32.exe");

    try
    {
        // レジストリから読み込み
        path = rKey.GetValue("").ToString();
    }
    catch (System.Security.SecurityException) { throw; } //レジストリキーからの読み取りに必要なアクセス許可がユーザーにありません。
    catch (System.UnauthorizedAccessException) { throw; } //必要なレジストリ権限がユーザーにありません。
    //catch (System.ObjectDisposedException) { throw; } //破棄されたキーを参照した場合
    //catch (System.IO.IOException) { throw; }
    catch
    {
        throw new ApplicationException("AdobeR AcrobatR もしくは ReaderR がインストールされていないため、PDFファイルの印刷ができません。");
    }
    finally
    {
        rKey.Close();
        rKey = null;
    }

    return path;
}

途中、try-catchでSystem.ObjectDisposedExceptionとSystem.IO.IOExceptionの捕捉をコメントにしているのは、その2つの例外が発生した場合にもインストールされていないと判断するためです。


以下余談

Adobe Reader単体でコマンド引数を使用して直接印刷をかけるのは止めたほうがいいと個人的には思う。
何故かというと、Adobe Readerに直接PDFファイルのパスを渡して印刷する方法だと、Adobe Reader自体の画面表示させないように設定してもバックグラウンドで動かなかったり、印刷完了しても画面が閉じられずプロセスが残ってしまうことがあるからです。
印刷はできるけどね。

こればかりは何ともいえないところですが、回避策としてとりあえず2点。
1. タイムアウトを指定して、印刷されたであろう時間が経過した後にプロセスをkillする
2. プリンタのキューを監視してプリンタへの印刷指示が完了したことを確認後プロセスをkillする


出来れば、Adobe Acrobat SDKでそれ用のプログラムを作成することをおすすめする。

なんかいい方法ないもんかね。

2011年3月6日日曜日

Android開発環境構築メモ

いろいろと自分用のメモでもあるので、
細かいところや説明とかは一切省くことにする。
※Windows用です。

  1. JDK
    http://java.sun.com/javase/ja/6/download.html
  2. Android SDK
    http://developer.android.com/intl/ja/sdk/index.html
  3. Android SDKのPATH設定
    任意の場所に設置後Toolディレクトリに対してPATHを通しておく(できればその後に再起動)
  4. Eclipse (というかPleiades)
    http://mergedoc.sourceforge.jp/
  5. Eclipse→Android Pluginインストール
    1. Eclipse起動。
    2. [メニュー]→[ヘルプ]→[新規ソフトウェアのインストール]
    3. 名前は任意(Androidとか入れとけ。)
    4. [ロケーション]は[ https://dl-ssl.google.com/android/eclipse/ ] うまくいかないなら[ http://dl-ssl.google.com/android/eclipse/ ]
    5. 取り合えず全部入れとく。
    6. インストール後、再起動を勧められるので従う。(本来は最適化もしたいところ[Eclipse終了後、-cleanオプション])
    7. Android SDK入れたとこにあるSDK Manager.exeを実行してSDKとかAVDとかいろいろ入れる。
  6. あとは作る。とにかく作り出す。

2011年3月3日木曜日

SQL Serverでクエリを使ってテーブルの列情報を取得する

SQL Server 2000以降ならつかえたはず。
知っといて損はないクエリ。

意外とこういうことできることを知らない人が多い気がする。
…うちの会社はね。

後付でテーブル設計書作るときに必要な情報も大抵はこれでOKかと。