概要
世の中の流れがHTML5となったため、更新がされず放置された
オワコン気味なSilverlightですが、調べる機会があったので書こうと思います。
やりたいこと
DB(SQL Server)にローカルアプリのように直接接続する。
一般的にSilverlightの場合、DBに接続するにはWebサービス経由で行います。
自前で.NETでWCFサービスを作成したり、WCF RIA Serviceで自動生成する方法などがあります。
今回はこのようなサービス経由ではなく、直接DBに接続する方法を考えます。
前提
標準のSilverlightだと基本的にWebサービス経由以外でDBに接続するのが難しいため、SilverlightをWebブラウザ経由のWebアプリとしてではなく、
ローカルアプリケーションとして動かすことで色々と制限が緩和されるOutOfBrowser(以下OOB)での起動を前提とします。
方法
OutOfBrowserにすることで、以下の2つの機能が可能になります。
1.P/Invokeによるアンマネージドコードの呼び出し
2.COMオブジェクトへのアクセス
1は.NETアプリでも過去のC++などの資産やWin32APIを呼び出したい場合などに使用しますが、
残念ながらSilverlightから.NETのマネージドコードを呼び出すことはできません。
(できればADO.NETなどの機能を呼び出せるのですが・・・。)
2と合わせて.NETのライブラリにCOM経由の口を作って呼び出すことが可能なようですが、面倒くさそうなのでパス。
その他に、MFCなどのアンマネージドコードのDB接続するための機能(CRecordSet)を直接もしくはラップしたライブラリを呼び出しも可能だと思いますが
今回は2のCOMでADOを直接呼び出す機能を使って実現します。
VBAなどでこの機能を使ってDBに接続していることがよくあります。
準備
まずはSilverlightのアプリをOOBで動かすための設定を行います。
1.Silverlightプロジェクトの設定画面を開く
SilverlightアプリケーションをVisualStudioで立ち上げた状態でソリューションエクスプローラで対象のSilverlightアプリのプロジェクトを選択して右クリック→プロパティを選択します。
2.OOBの設定
Silverlightのプロジェクト設定が開かれるので、
アプリケーションのブラウザ外実行を有効にする にチェックを入れて、ブラウザ外実行の設定ボタンを押します。
するとダイアログが表示されるので、ブラウザ外実行時に昇格された信頼を要求する にチェックを入れます。
一度アプリをビルド実行してみて、ブラウザではなく通常のウインドウ形式のアプリとして起動されるか確認してください。
次に、System.Core.dllとMicrosoft.Charp.dllを参照に加えてください。
これで設定は終わりです。
実装
あとは下記のように記述することで、DBに接続可能です。
非同期ではなく同期処理になるので大容量データを取り出したりする場合はTaskクラス等で非同期処理に置き換えてもいいと思います。
そのほか、細かい記述方法などはVBAの同等処理を参考にするとよいと思います。
参考URL:http://www.geocities.jp/cbc_vbnet/ADO/recordset.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//接続文字列 private string _connectionString = ""; private void DBDirect(string query) { using (dynamic con = AutomationFactory.CreateObject("ADODB.Connection")) { using(dynamic rs = AutomationFactory.CreateObject("ADODB.RecordSet")) { //接続をオープン con.Open(_connectionString); //クエリを実行 rs.Open(query); while (!rs.EOF) { //フィールドを取り出す処理をここに記述 //1レコードずつ取り出し var id = (int)rs.Fields("UserID").Value; //次のレコード rs.MoveNext(); } rs.Close(); } con.Close(); } } |
まとめ
ということで、駆け足ですがSilverlightでサービス等を経由せずにデータベースに直接する方法を紹介しました。
アプリや処理が大量にあるならば、ライブラリ化してレコードセットから取り出す際にリフレクション等でO/Rマッピングする機能を入れてみるのもよいかもしれません。
機会があれば、そのほかの接続方法との処理時間比較などもしてみたいと思います。
2015/06/06 トランザクションなどを説明したその2を投稿しました。
SilverlightでDBに直接接続する その2