nobu blog

プログラミングやゲーム、ゲーム音楽コンサート周りの話をつらつらと。

*



SilverlightでDBに直接接続する その2

      2015/06/08

概要

前回Silverlightを用いたDB直接接続の方法を紹介しました。
その後、気がついた点を何点か紹介しようと思います。

スポンサーリンク

接続文字列に関して

ADOのコネクションを開く際に接続文字列を指定しますが、SQLServerを用いた接続では以下の2種類のプロバイダ指定で利用可能です。

その1:ODBCプロバイダ
DRIVER={SQL Server};SERVER=(local);UID=sa;PWD=sa;
その2:OLE DBプロバイダ
Provider=SQLOLEDB;Password=sa;Persist Security Info=True;User ID=sa;Data Source=(local)

トランザクションを用いた複数クエリの実行などをする場合にはOLE DBプロバイダを利用します。(詳細は後述します。)
また、OLE DBプロバイダを利用した場合には、一部のクエリやストアド実行中に例外が発生します。
そのような場合には、クエリの先頭で以下のようにNOCOUNT ONにしてください。

SET NOCOUNT ON
–この後にクエリ本体を書きます。

そのほか、OracleなどのDBに関しても以下のような接続文字列情報を参考に設定すれば繋がると思います。
接続文字列一覧

 

トランザクションを用いた処理

INSERTやUPDATE,DELETEなどを用いた複数のクエリ実行でトランザクションをかける必要がある場合があります。
そのような場合には以下のように開始時にトランザクションを開始し、最後にコミットまたはロールバックを行うことで実現できます。
注意事項として、前述の接続文字列でODBCプロバイダを用いると2クエリ目の実行で例外が発生してエラーとなってしまいます。
なので、トランザクション機能を利用したい場合にはOLE DBプロバイダを利用するようにしてください。

前回の記事ではクエリ実行時にコネクションを開いていましたが、上記の例では既にOpenされたprivateメンバ(_connection)を用いています。
以下のようにアプリケーションの起動処理としてあらかじめOpenしておき、終了処理でCloseするようにします。

SELECTのパフォーマンスに関して

ADOを用いることで非同期から同期処理になるのですが、残念ながらSELECTを用いたデータ取得に関してはパフォーマンスは非常に遅いです。
RecordSetからフィールド値を特定の型にキャストする取得する処理が非常に重いようです。
なので、1レコードの戻り値を返すようなSELECTやストアド程度でなければ使用するのは難しいと思います。
また、そのような場合にも一度、ダミーのクエリ実行をアプリケーションの起動時に実行しておくことをお勧めします。
dynamic型を用いた処理は2回目以降はキャッシュが効くため、早くなります。

 

最後に

簡単ですが、OOBを用いたSilverlightでのADOでのDB直接接続に関して追加情報を記述しました。
前回の記事と合わせて見てください。

SilverlightでDBに直接接続する(OOB限定)

C#によるWEB開発の次の一歩としてSilverlightから卒業し、ASP.NET MVCを学んで見るのも良いと思います。

 - C#, Silverlight