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 アセンブリのビルド
- Visual C# 2010 Express を起動する
- クラスライブラリプロジェクトを作る
- プロジェクトを保存する
- プロジェクトのプロパティを開く
- ターゲットとする .NET Framework のバージョンを 2.0 に変更する
- 参照がエラーになるので先に削除してしまいましょう
- 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; } } }
ここまでできれば、基本的なビルド作業はできることがわかります。
もう少し自動化しましょう。
登録・更新の自動化
- ストアドプロシージャや 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 とします。
- プロジェクトのプロパティを開く
- ビルドのポスト処理に以下を登録
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 のアセンブリを作ったときに、 データベースへの登録、更新を自動化する方法でした。
いまのところこんな感じで使えてますが、もっといい方法があったらぜひ教えてください。