@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

DBアクセス部品の後始末

1
投稿者投稿内容
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2006-08-18 10:56
素朴な疑問なのですが
DbDataReader,DbCommand,DbConnectionを使用したあとの後始末は
どのようにやっていますか?

DbDataReader.Close() or Dispose();
DbCommand.Dispose();
DbConnection.Close() or Dispose();

上記のメソッドが存在しますが、参考にするものによって
後始末の処理は違っているようです。
どの処理が正しいのでしょうか?
あるいは、Close()あるいはDispose()のどちらかを呼べば良いのでしょうか?
あるいは両方を呼ぶ?
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-08-18 11:18
引用:

頭脳パンさんの書き込み (2006-08-18 10:56) より:

DbDataReader,DbCommand,DbConnectionを使用したあとの後始末は
どのようにやっていますか?

DbDataReader.Close() or Dispose();
DbCommand.Dispose();
DbConnection.Close() or Dispose();


ボクは一応両方呼んでいます。
自分が、クラスを設計した場合、Close() メソッド、Dispose() メソッドを実装するにはそれなりの理由があると思うからです。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2006-08-18 11:19
頭脳パンさん、こんにちは。

引用:

あるいは、Close()あるいはDispose()のどちらかを呼べば良いのでしょうか?
あるいは両方を呼ぶ?



Close, Dispose で検索してみました(スレッドタイトルで判断しないで、一通り目を通してみると参考になると思います)。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-08-18 11:32
引用:

上記のメソッドが存在しますが、参考にするものによって
後始末の処理は違っているようです。
どの処理が正しいのでしょうか?



分かりません。

どれも正しいかもしれないし、中には間違っているものもあるかもしれません。
そもそも「正しい」かどうかも、そのコードの目的によって基準が異なります。

例えば、データベース利用の基本的な流れを説明するためのコードに、接続エラーなどへの対処を盛り込んでしまうと、説明したいことがエラー対策のコードに埋まって見えにくくなってしまいます。
これは好ましいことではありません。

引用:

あるいは、Close()あるいはDispose()のどちらかを呼べば良いのでしょうか?
あるいは両方を呼ぶ?



各クラスの実装に依存します。

なので、抽象クラスである DbDataXXX について論じても意味はありません。
毎回、各クラスの Close(), Dispose() のヘルプをよく読んで確認してそのクラスを利用するべきです。

個人的には、Dispose() 以外に Close() 等を実装しているクラスについては、正常系では Close() を呼び、異常系で IDisposable.Dispose() を明示的に呼び出すか、全体を using 句で括るようにしています。
(それで大抵問題ありません。初出クラスについては、利用前にヘルプを確認しています)

例えば、ファイル操作に関しては以下のようなコードを定石として利用しています。

コード:
using (FileStream stream = new FileStream(xxx))
using (StreamReader reader = new StreamReader(stream, xxx))
{
  // 必要な処理

  reader.Close();
  stream.Close();
}


vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2006-08-18 11:36
CLRはマネージドだから安全なんダ!(違
リソースの開放を今更人間様がやるのはオカシイんダ!(違
と考えると、Disposeなんかいちいち呼ぶのは面倒ですよね。

まあでも、リソースが開放されないのも困るので、
Open/Closeは自分で書いて、Disposeはusingの構文に
やってもらうことにしています。

using(DbDataReader reader = command.ExecuteReader())
{
 while (reader.Read())
 {
  ...
 }
 reader.Close();
}
みたいな感じで。
DbConnection、DbCommand、DbDataReader、…と使っていくと
入れ子が多くなるのがちょっとイヤですけど。
頭脳パン
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 89
投稿日時: 2006-08-18 11:44
みなさん、ありがとうございます。
>DbConnection、DbCommand、DbDataReader、…と使っていくと
>入れ子が多くなるのがちょっとイヤですけど。
というような理由で結論をちょっと急ぎすぎました。

>なので、抽象クラスである DbDataXXX について論じても意味はありません。
なるほどという感じです。
今回、汎用的なDBアクセス部品のコーディングなので
まちがってはいけないと思い、正解ソースがあるならご教授下さい
という感じで質問を投げました。

汎用的な処理のため、DbXXXを使用しています。
どのプロバイダーが使用されるかはわからないのです。
さてどうしたものか。
このような場合、両方呼ぶのが一番安全なのでしょうか。

1

スキルアップ/キャリアアップ(JOB@IT)