- - PR -
DBアクセス部品の後始末
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-08-18 10:56
素朴な疑問なのですが
DbDataReader,DbCommand,DbConnectionを使用したあとの後始末は どのようにやっていますか? DbDataReader.Close() or Dispose(); DbCommand.Dispose(); DbConnection.Close() or Dispose(); 上記のメソッドが存在しますが、参考にするものによって 後始末の処理は違っているようです。 どの処理が正しいのでしょうか? あるいは、Close()あるいはDispose()のどちらかを呼べば良いのでしょうか? あるいは両方を呼ぶ? | ||||||||||||
|
投稿日時: 2006-08-18 11:18
ボクは一応両方呼んでいます。 自分が、クラスを設計した場合、Close() メソッド、Dispose() メソッドを実装するにはそれなりの理由があると思うからです。 | ||||||||||||
|
投稿日時: 2006-08-18 11:19
頭脳パンさん、こんにちは。
Close, Dispose で検索してみました(スレッドタイトルで判断しないで、一通り目を通してみると参考になると思います)。 | ||||||||||||
|
投稿日時: 2006-08-18 11:32
分かりません。 どれも正しいかもしれないし、中には間違っているものもあるかもしれません。 そもそも「正しい」かどうかも、そのコードの目的によって基準が異なります。 例えば、データベース利用の基本的な流れを説明するためのコードに、接続エラーなどへの対処を盛り込んでしまうと、説明したいことがエラー対策のコードに埋まって見えにくくなってしまいます。 これは好ましいことではありません。
各クラスの実装に依存します。 なので、抽象クラスである DbDataXXX について論じても意味はありません。 毎回、各クラスの Close(), Dispose() のヘルプをよく読んで確認してそのクラスを利用するべきです。 個人的には、Dispose() 以外に Close() 等を実装しているクラスについては、正常系では Close() を呼び、異常系で IDisposable.Dispose() を明示的に呼び出すか、全体を using 句で括るようにしています。 (それで大抵問題ありません。初出クラスについては、利用前にヘルプを確認しています) 例えば、ファイル操作に関しては以下のようなコードを定石として利用しています。
| ||||||||||||
|
投稿日時: 2006-08-18 11:36
CLRはマネージドだから安全なんダ!(違
リソースの開放を今更人間様がやるのはオカシイんダ!(違 と考えると、Disposeなんかいちいち呼ぶのは面倒ですよね。 まあでも、リソースが開放されないのも困るので、 Open/Closeは自分で書いて、Disposeはusingの構文に やってもらうことにしています。 using(DbDataReader reader = command.ExecuteReader()) { while (reader.Read()) { ... } reader.Close(); } みたいな感じで。 DbConnection、DbCommand、DbDataReader、…と使っていくと 入れ子が多くなるのがちょっとイヤですけど。 | ||||||||||||
|
投稿日時: 2006-08-18 11:44
みなさん、ありがとうございます。
>DbConnection、DbCommand、DbDataReader、…と使っていくと >入れ子が多くなるのがちょっとイヤですけど。 というような理由で結論をちょっと急ぎすぎました。 >なので、抽象クラスである DbDataXXX について論じても意味はありません。 なるほどという感じです。 今回、汎用的なDBアクセス部品のコーディングなので まちがってはいけないと思い、正解ソースがあるならご教授下さい という感じで質問を投げました。 汎用的な処理のため、DbXXXを使用しています。 どのプロバイダーが使用されるかはわからないのです。 さてどうしたものか。 このような場合、両方呼ぶのが一番安全なのでしょうか。 |
1