- PR -

[VB.NET]ADO.NETのコネクションとデータアダプタの関係について

投稿者投稿内容
ちづる
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 72
投稿日時: 2004-08-23 11:23
皆様のご意見を伺いたいと思いまして、投稿させていただきます。

今VB.NETを使用してデータベースに接続して、何かしらの処理(検索・更新・削除・登録)を
行っています。
その際に一つのコネクションと多数のデータアダプタを使用しています。

1回、コネクションOPEN後データアダプタを使用し、その後で別のデータアダプタを
使用しようとすると「既に開かれています」というエラーで落ちます。

対策として、処理の直前で1回1回コネクションをCLOSEし再度OPENをしています。


コネクションをOPEN後に多数のデータアダプタを使用する場合に、上記のように
そのたびにコネクションをCLOSE→OPENをしなければいけないものなのでしょうか?
VB6のときにそんな制限はなかったもので、ずっと疑問に思っています。


何か名案がありましたら、教えていただけたら幸いです。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-23 11:46
 System.Data.Common.DataAdapterクラスで定義されているFillメソッド、Updateメソッドでは、コネクションをオープン、クローズする必要はありません(と、MSDNに書いてある)。メソッド内で勝手にオープン/クローズします。
ちづる
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 72
投稿日時: 2004-08-23 11:58
>Jittaさん
アドバイスありがとうございます。

UPDATEメソッドと使用せずに、内部でSQL文を組んでそれを使用していて
excuteReaderやExecuteNonQueryを起動させています。

なので、故意にopen/closeをしないとならないのか?というのが疑問として
あるのです。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-08-23 12:43
DataAdapterとDataReaderを混同していませんか?
全然別のものです。
一つのコネクションで同時に開けるDataReaderは一つです。
よって、都度Open,Closeする必要があるでしょう。

DataAdapterを利用した場合はJittaさんの説明のとおりです。

ちなみに、コネクションが必要になる直前にOpenし、使い終わった直後に確実にCloseするようにすると良いと思います。
_________________
「伝える」とは「人に云う」と書く。
http://d.hatena.ne.jp/NAL-6295/
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-23 13:24
NAL-6295さんのとおりです。

 複数のDataReaderを使う場合、複数のConnectionを作るか、それぞれのDataReaderを使用する直前/直後にオープン/クローズをします。または、1つのDataReaderを使い回します。
#そういえば、DataAdapterのFill, Updateメソッドは、オープンされていたら
#オープンされたまま、クローズされていたらクローズして帰ってくるのでした

 1回のトランザクションで複数の処理を行いたい場合、DataAdapterを使用する方がよいでしょう。1つのDataReaderは、1つのSQL*PLUS(SQL Serverではosql?)に相当すると考えてください。1つのDataReader(問い合わせ)を実行中は、他のDataReader(問い合わせ)を実行できないですよね。
ちづる
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 72
投稿日時: 2004-08-23 13:25
>NAL-6295さん
おっしゃるとおりに、DataAdapterとDataReaderを混同してました。
私が知りたかったのはDataReaderのほうでした。

やはりその都度Open、Closeする必要があるようですね。

それでは、
以下のようなケースの場合はDataAdapterとDataReaderのどちらが適切なのでしょうか?

■バッチ処理のようなDBから情報を読んでは更新を繰り返す場合
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-08-23 16:04
DataAdapter は データソースとデータセットの間の通信を助ける道具だと思ってください。
データセットを使わなければ、DataAdapter はいりません。

>以下のようなケースの場合はDataAdapterとDataReaderのどちらが適切なのでしょうか?
>■バッチ処理のようなDBから情報を読んでは更新を繰り返す場合
バッチ処理の場合はデータを表示する必要が無いのでしょうから、
DataAdapter よりは DataReader が適切です。

ただし、一般にデータベースのストアドプロシージャの方が高速なので、DataReader がベストというわけではないです。
_________________
えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12
えムナウのプログラミングのページ Blog1 Blog2
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-23 17:30
引用:

ちづるさんの書き込み (2004-08-23 13:25) より:

■バッチ処理のようなDBから情報を読んでは更新を繰り返す場合



 DataReaderを使うなら、1つの読み込み動作を完了させた後、次の動作を行わなければなりません。先に「SQL*PLUSでコマンドを発行するようなもの」と書いたとおりです。SELECTすると、その結果をすべて表示してしまうまで、次のコマンドは発行できません。

 そこで、「データを読み取る」という動作と、「必要に応じてデータを加工する」という動作、「加工したデータをデータベースに書き戻す」という動作の3つに分解します。そうすると、手順を次のようにできます。

while (データがある) {
 DataReader.Read();
 読み込んだデータをDataTableに入れる
 AcceptChange()
 データを加工する
}
DataAtapter.Update(DataTable);

 AcceptChangeするのは、DataTable.Addで、RowStateがINSERTEDになったと思うから。その後に加工=編集することで、UPDATEDになります。


#DataSetの使い道は、表示だけではないですよ

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