中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

DataAdapterの終了処理

2004/06/18追記
解決策をhttp://blogs.users.gr.jp/naka/archive/2004/06/18/3218.aspxこちらに記載。

DataAdapterってComponentModel.Componentを継承しているんですよねー

これって確かにデザイナで置けるようにするためなんだろうけど必要以上にDisposeを要求するという負の面もあるわけです。

で利用したら処分しなくちゃいけないわけで、デザイナ上で利用しない場合には

  public static void Disposer(OleDbDataAdapter da)
  {
   if ( da != null )
   {
    if ( da.SelectCommand != null )
    {
     if ( da.SelectCommand.Connection != null )
     {
      da.SelectCommand.Connection.Close();
      da.SelectCommand.Connection.Dispose();
      da.SelectCommand.Connection = null;
     }
     da.SelectCommand.Dispose();
     da.SelectCommand = null;
    }
    if ( da.InsertCommand != null )
    {
     if ( da.InsertCommand.Connection != null )
     {
      da.InsertCommand.Connection.Close();
      da.InsertCommand.Connection.Dispose();
      da.InsertCommand.Connection = null;
     }
     da.InsertCommand.Dispose();
     da.InsertCommand = null;
    }
    if ( da.UpdateCommand != null )
    {
     if ( da.UpdateCommand.Connection != null )
     {
      da.UpdateCommand.Connection.Close();
      da.UpdateCommand.Connection.Dispose();
      da.UpdateCommand.Connection = null;
     }
     da.UpdateCommand.Dispose();
     da.UpdateCommand = null;
    }
    if ( da.DeleteCommand != null )
    {
     if ( da.DeleteCommand.Connection != null )
     {
      da.DeleteCommand.Connection.Close();
      da.DeleteCommand.Connection.Dispose();
      da.DeleteCommand.Connection = null;
     }
     da.DeleteCommand.Dispose();
     da.DeleteCommand = null;
    }
    da.Dispose();
   }
  }

ちょっと冗長だけどこんだけ必要なのよね。

Disposeを誰がするのか、内部に持っているインスタンスのDisposeを誰がするのかっていうのもかなり難しい問題で、DataAdapterが勝手にDisposeしてもいいとは思うんだけど、もしかしてConnectionは他でも使っているかもしれない。

難しいね

 

投稿日時 : 2004年6月12日 22:33

コメントを追加

# re: DataAdapterの終了処理 2004/06/13 8:18 菊池

ComponentModel.Container を使ったほうが良いと思います。

 Component な物は Containerにもってもらえば一連托生でなくなりまする。

# re: DataAdapterの終了処理 2004/06/13 10:20 渋木宏明(ひどり)

↑とまったく同じことですが、デザイナを通した時と同じ終了手順でよいなら、フレームワークが用意しているコレクションにねじこんでしまうんでもOKじゃないすか?

# re: DataAdapterの終了処理 2004/06/13 14:24 中 博俊

ねじ込んでたのを抜く必要があったんでついでに書いたわけですがいろいろ難しいなと思いましたね。
DataAdapterがコネクション持っていてもいいような気がするしねー。

# re: DataAdapterの終了処理 2004/06/15 14:57 菊池

DataAdapterがコネクション持っちゃうと、複数のテーブルを同一トランザクションでUpdateできなくなるのでいやん。

って事だと思うのですが。

# re: DataAdapterの終了処理 2004/06/15 16:00

DataAdapterが自前で持つんじゃなくって.Connectionで設定すると配下のコマンドに受け渡してくれても良いような気がするんですよね。
いやややこしくなるし、そんなにいやんって言うわけではないんですが、SelectCommandが頻繁に変わる場合結局コネクションも別で管理してあげなくっちゃ行けないため不便な局面もあるなぁって。

# YHBoadcEjHxuTmjmeB 2011/12/27 0:31 http://www.discreetpharmacist.com/ger/index.asp

I must admit, the webmaster is a cool guy..!

タイトル
名前
URL
コメント