スポンサーリンク
概要
前回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プロバイダを利用するようにしてください。
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
//ADOコネクション(起動時などにあらかじめOpenさせておきます。 private dynamic _connection = null; /// <summary> /// NonSelectのクエリをまとめて実行 /// </summary> /// <param name="querys">クエリ一式</param> /// <returns>実行結果(0:成功、1:失敗)</returns> private int ExecuteNonSelectQuery(IEnumerable<string> querys) { int result = 0; var currentQuery = string.Empty; try { //トランザクション開始 _connection.BeginTrans(); //クエリを順番に実行 foreach (var query in querys) { currentQuery = query; _connection.Execute(currentQuery); } } catch (Exception e) { //TODO ここにクエリ実行中に例外発生の場合の処理を記述(ログとか) result = 1; } //全クエリが実行できたらコミット処理 if (result == 0) { try { _connection.CommitTrans(); } catch (Exception e) { //TODO ここにコミット実行中に例外発生の場合の処理を記述(ログとか) result = 1; } } //途中で処理が失敗した場合にロールバック if(result != 0) { try { _connection.RollbackTrans(); } catch (Exception e) { //TODO ここにロールバック実行中に例外発生の場合の処理を記述(ログとか) result = 1; } } return result; } |
前回の記事ではクエリ実行時にコネクションを開いていましたが、上記の例では既にOpenされたprivateメンバ(_connection)を用いています。
以下のようにアプリケーションの起動処理としてあらかじめOpenしておき、終了処理でCloseするようにします。
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
//ADO接続のための接続文字列 private string _connectionString; //ADO接続のためのコネクション private dynamic _connection = null; /// <summary> /// ADOの初期接続を実施します。処理成功時には0、失敗時には1を返します /// </summary> private int InitConnection() { try { //コネクションを開く _connection = AutomationFactory.CreateObject("ADODB.Connection"); _connection.Open(_connectionString); return 0; } catch (Exception e) { //TODO Open失敗時の処理を記述します。(ログなど) return 1; } } /// <summary> /// コネクション開放 /// </summary> private void EndConnecion() { try { if (_connection != null) { _connection.Close(); } } catch (Exception e) { //TODO コネクション開放失敗時の処理を記述します。(ログなど) } } |
SELECTのパフォーマンスに関して
ADOを用いることで非同期から同期処理になるのですが、残念ながらSELECTを用いたデータ取得に関してはパフォーマンスは非常に遅いです。
RecordSetからフィールド値を特定の型にキャストする取得する処理が非常に重いようです。
なので、1レコードの戻り値を返すようなSELECTやストアド程度でなければ使用するのは難しいと思います。
また、そのような場合にも一度、ダミーのクエリ実行をアプリケーションの起動時に実行しておくことをお勧めします。
dynamic型を用いた処理は2回目以降はキャッシュが効くため、早くなります。
最後に
簡単ですが、OOBを用いたSilverlightでのADOでのDB直接接続に関して追加情報を記述しました。
前回の記事と合わせて見てください。
C#によるWEB開発の次の一歩としてSilverlightから卒業し、ASP.NET MVCを学んで見るのも良いと思います。