Visual C# 2010 Express で CLR SQL コンポーネントを作る方法

Visual C# 2010 Express では残念ながら、 CLRSQL 用のアセンブリを作成するためのデータベースプロジェクトは含まれていません。 そこで、 Visual C# 2010 Express を用いつつ、少しでも開発作業を自動化する方法を考えてみました。

考え方は単純です。

Visual C# のプロジェクトのポストビルドイベントを利用して、SQL Server に登録したアセンブリを登録・更新します。

環境設定

CLRSQL を使う方法 を参考に設定します。 要は CLRSQL が実行可能な状態となれば OK です。

それとこの資料ではタイトルの通り、 Visual C# 2010 Express を利用してますので、 お持ちで無い方はインストールしてください。

もちろん、それよりグレードの高いバージョンをお持ちの方は、このページの情報は意味が無いので、 ここで読むのをやめて他のページをご覧ください(笑)

Visual C# 2010 Express での CLRSQL アセンブリのビルド

  1. Visual C# 2010 Express を起動する
  2. クラスライブラリプロジェクトを作る

  3. プロジェクトを保存する
  4. プロジェクトのプロパティを開く
  5. ターゲットとする .NET Framework のバージョンを 2.0 に変更する

  6. 参照がエラーになるので先に削除してしまいましょう

  7. using に次を追加
    using System.Data.SqlTypes;
    using Microsoft.SqlServer.Server;
    

以上で単純なコードはビルド可能なはずです。テストコードはこちら。

using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

namespace clrsql1
{
    public class Class1
    {
        [SqlFunction]
        public static SqlBoolean Test( SqlString s )
        {
            return SqlBoolean.False;
        }
    }
}
例1. 単純な CLRSQL UDF

ここまでできれば、基本的なビルド作業はできることがわかります。
もう少し自動化しましょう。

登録・更新の自動化

  1. ストアドプロシージャや UDF の作成、削除スクリプトをそれぞれ regsql.sql、unregsql.sql という名前で作成します。

    ----- regsql.sql -----
    CREATE FUNCTION dbo.fn_Test ( @s NVARCHAR(max) )
    RETURNS BIT
    AS 
    EXTERNAL NAME clrsql1.[clrsql1.Class1].Test
    
    ----- unregsql.sql -----
    IF OBJECT_ID('dbo.fn_Test') IS NOT NULL 
    BEGIN
    	DROP FUNCTION dbo.fn_Test;
    END
    

    尚、スクリプトファイルのエンコーディングに注意してください。UTF-8 は読み込めないので ANSI とします。

  2. プロジェクトのプロパティを開く
  3. ビルドのポスト処理に以下を登録
    osql -E -S. -d TestDB -i $(ProjectDir)unregsql.sql
    osql -E -S. -d TestDB -Q "DROP ASSEMBLY $(ProjectName)"
    osql -E -S. -d TestDB -Q 
     "CREATE ASSEMBLY $(ProjectName) FROM '$(TargetPath)' WITH PERMISSION_SET=SAFE"
    osql -E -S. -d TestDB -i $(ProjectDir)regsql.sql
    

    注: 実際には osql のコマンド毎に改行は含めません。全4行になります。 以下のスクリーンショットをみてください。

以上、Visual C# 2010 Express で CLRSQL のアセンブリを作ったときに、 データベースへの登録、更新を自動化する方法でした。

いまのところこんな感じで使えてますが、もっといい方法があったらぜひ教えてください。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説