DOBON.NET DOBON.NETプログラミング掲示板過去ログ

c#でのdbのopen・closeの記述場所

環境/言語:[vs2010以降 Oracle12c]
分類:[.NET]

2014/04/08(Tue) 11:19:22 編集(投稿者)

2週間ほど前から、システム構築の為にvs2010(以降)のc#とOracle12cを使用したソフトウェアを勉強の為に作っています。
(DOS時代のプログラム経験有りです)
尚、c#とOracleは初心者の状態です。

例えば、マスター保守画面などの場合、いくつかのテーブルにアクセスする必要がありますが、
このような場合、どこでオープンしてどこでクローズするものなのでしょうか?

頭の中が整理されていませんので箇条書きになりますが、
・各テーブルにアクセスする都度open、closeするが一般的?
・DataGridViewなどを使用した場合、closeしちゃうとDataSetとか駄目になっちゃうのでは?
・各イベント処理内で同じテーブルにアクセスさせたいが、各イベントでopenする?
など様々な疑問があり、
プログラム内の1箇所でopenし、プログラムの終了時にcloseはできないものかと思っています。
このような事が可能な場合、どこにどのようにopen、closeを記述すればよいのでしょうか?

もちろん内容にもよるかと思いますが、一般的な方法で構いません。
どうぞよろしくお願いいたします。
■No32248に返信(dt-8500さんの記事)
> ・各テーブルにアクセスする都度open、closeするが一般的?
連続で読み込むものがあればその最初と最後で行うのが一般的。
出来るだけ短く。ただし短い時間に頻繁にopen,closeしないようにする。


> ・DataGridViewなどを使用した場合、closeしちゃうとDataSetとか駄目になっちゃうのでは?
メモリテーブルへ読み込んでしまうのが一般的なのでcloseしても問題はない。


> ・各イベント処理内で同じテーブルにアクセスさせたいが、各イベントでopenする?
外部で更新された情報を読むタイミングでDBアクセスするのみとし
同一プロセス内ではデータを共有するようにする。
■No32248に返信(dt-8500さんの記事)

接続の Open/Close をどのように行うかは、基本的に、コネクションリークを
防止するという観点で行うことが重要だと思います。

shu さんの回答とダブルところがありますが、上記の観点からレスします。

> ・各テーブルにアクセスする都度open、closeするが一般的?

できるだけギリギリまで待って Open し、使い終わったら即 Close するように
してください。

また、例外が発生した時にも確実に Close できるよう、try - finnaly または
using ブロックを使うようにしてください。

> ・DataGridViewなどを使用した場合、closeしちゃうとDataSetとか駄目になっちゃうのでは?

データアクセスには DbConnection, DbCommand, DbDataReader を使う接続型と
DataSet/DataTable, DbDataAdapter を使う非接続型があります。

上記の質問のケースは後者の非接続型データアクセスになります。

その場合は一旦接続は Close するというのが目的の一つですので、Close し
ても全く問題ないようになってます。

非接続型データアクセスの目的は、ユーザーの編集作業中に DB への接続を
維持しないで済むよう、一旦メモリ上の DataSet/DataTable に DB からデー
タを取り込んで接続を Close し、ユーザーが UI (DataGridView) を通じて
DataSet/DataTable のデータの編集を完了してから、DbDataAdapter を使って
再度接続を Open し DataSet/DataTable の編集内容を一気に DB に反映する
というものです。

そのメカニズムは、以下のページの図1、図2が非常に分かりやすいと思い
ます。

DB 設計者のための明解 ADO.NET 第 1 回
http://msdn.microsoft.com/ja-jp/events/dd231281.aspx

なお、DbDataAdapter は自動的に接続を Open し、自動的に Close するよう
になってますので、特に理由がない限りユーザーが Open/Close を記述する
必要はありません。

> ・各イベント処理内で同じテーブルにアクセスさせたいが、各イベントでopenする?

具体的にどのようにしたいのかよく分かりませんが、一番最初の質問に対する
答えが基本です。

以下のページをよく読んでみることをお勧めします。コネクションリーク防止
のための処置は Part.2 になりますが、一般的な例外処置と密接に関連してま
すので Part.1 から読んでください。

.NETの例外処理 Part.1
http://blogs.msdn.com/b/nakama/archive/2008/12/29/net-part-1.aspx

.NETの例外処理 Part.2
http://blogs.msdn.com/b/nakama/archive/2009/01/02/net-part-2.aspx

上記は DB に SQL Server、プロバイダに SQL Client を使った場合ですが、
基本は Oracle + OPD.NET を使っても同じはずです。
shu様、WebSurfer様、ありがとうございます。
shu様のコメント後、道が開けてきていたのですが、
WebSurfer様のコメントで一気に先が見えてきました。

私のような者には、ここまで説明していただけると助かります。

>なお、DbDataAdapter は自動的に接続を Open し、自動的に Close するよう
>になってますので、特に理由がない限りユーザーが Open/Close を記述する
>必要はありません。
このコメントで多くの謎が解けました。
(大量の参考書にもここまで書いていないんです・・・)
私のような者がこのような場で質問するのは早すぎるように思いますが、
この件は大変助かりました。
ありがとうございました。
解決済み!
■No32254に返信(dt-8500さんの記事)

> ここまで説明していただけると助かります。

そう言っていただけると、回答した甲斐があって、大変嬉しいです。

> 私のような者がこのような場で質問するのは早すぎるように思いますが、

そんなことは決してないので、どんどん質問してください。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板