ダメプログラマーのチラシウラ データベース

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

■DataTableManager

DataTableManagerではTransactionScopeが使えない?
Visual Studio 2008 で TableAdapterManager を TransactionScope 内で使用すると予期せぬ動作が生じる可能性がある
http://support.microsoft.com/kb/951153/ja

は!?
どうやら、DataTableManager側でTransaction管理を行っているのが原因ぽいようです(間違ってたらスマン
今の案件で型付DataSetをDataTableManager使ってUpdateAllするメソッドがあるのだが、
Trasaction管理が下記のようになってる。
Logic →Transaction1
 DataAccess → Transaction2
なので、これが使えない orz

はて、どうしたものか…。
階層更新を自前でコーディング…
そんなに工数ないし…

DataTableMnagerからTableAdapterを取得→各TableAdapterのUpdateを実行させる
…なんとも、あこぎなやり口ですが、以下の方法をとることに
       /// <summary>
       /// <para>TableAdapterクラスのDbDataAdapterを取得</para>
       /// </summary>
       /// <param name="adapter">対象DataTableManager</param>
       /// <returns>List<DbDataAdapte></returns>
       private List<DbDataAdapter> GetAdapters(object adapter)
       {
           List<PropertyInfo> pInfo = new List<PropertyInfo>() { };
           List<DbDataAdapter> dbAdapter = new List<DbDataAdapter>() { };
           Type type = adapter.GetType();
           pInfo.AddRange(type.GetProperties());
           pInfo.ForEach
           (
               p =>
               {
                   object curObject = p.GetValue(adapter, null);
                   if (curObject == null) return;
                   DbDataAdapter curAdapter = GetAdapter(curObject);
                   if (curAdapter == null) return;
                   dbAdapter.Add(curAdapter);
               }
           );
           return dbAdapter;
       }
       /// <summary>
       /// <para>TableAdapterクラスのDbDataAdapterを取得</para>
       /// </summary>
       /// <param name="adapter">対象TableAdapter</param>
       /// <returns>DbDataAdapter</returns>
       private DbDataAdapter GetAdapter(object adapter)
       {
           Type type = adapter.GetType();
           PropertyInfo adapterInfo = type.GetProperty("Adapter", BindingFlags.NonPublic | BindingFlags.Instance);
           if (adapterInfo == null) return null;
           DbDataAdapter dbAdapter = adapterInfo.GetValue(adapter, null) as DbDataAdapter;
           if (dbAdapter == null) return null;
           return dbAdapter;
       }
だれか、もっといいやりかたおせぇて orz

■OracleでTransactionScopeを使用する場合の注意点
Oracle(10gR2)でTransactionScopeを利用する際に、以下のエラーがでる場合があります。

"oramts.dllが見つかりません。"

このエラーが出た場合、以下の点を疑ってみてください。

マシンに、Oracle Services For Microsoft Transaction Service (OraMTS)がインストールされているかどうか?

OraMTSは、Oracle Clientをカスタムモードでインストールしないとインストールされません。

インストールすると、ORACLE_HOME/Binの下に以下のファイルが見つかります。

   * oramts.dll
   * oramts10.dll
| 新しいページ | 編集 | 差分 | 編集履歴 | ページ名変更 | アップロード | 検索 | ページ一覧 | タグ | RSS | ご利用ガイド | 管理者に問合せ |
|ログイン|