- - PR -
[VB.NET]ADO.NETのコネクションとデータアダプタの関係について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-08-23 11:23
皆様のご意見を伺いたいと思いまして、投稿させていただきます。
今VB.NETを使用してデータベースに接続して、何かしらの処理(検索・更新・削除・登録)を 行っています。 その際に一つのコネクションと多数のデータアダプタを使用しています。 1回、コネクションOPEN後データアダプタを使用し、その後で別のデータアダプタを 使用しようとすると「既に開かれています」というエラーで落ちます。 対策として、処理の直前で1回1回コネクションをCLOSEし再度OPENをしています。 コネクションをOPEN後に多数のデータアダプタを使用する場合に、上記のように そのたびにコネクションをCLOSE→OPENをしなければいけないものなのでしょうか? VB6のときにそんな制限はなかったもので、ずっと疑問に思っています。 何か名案がありましたら、教えていただけたら幸いです。 | ||||
|
投稿日時: 2004-08-23 11:46
System.Data.Common.DataAdapterクラスで定義されているFillメソッド、Updateメソッドでは、コネクションをオープン、クローズする必要はありません(と、MSDNに書いてある)。メソッド内で勝手にオープン/クローズします。
| ||||
|
投稿日時: 2004-08-23 11:58
>Jittaさん
アドバイスありがとうございます。 UPDATEメソッドと使用せずに、内部でSQL文を組んでそれを使用していて excuteReaderやExecuteNonQueryを起動させています。 なので、故意にopen/closeをしないとならないのか?というのが疑問として あるのです。 | ||||
|
投稿日時: 2004-08-23 12:43
DataAdapterとDataReaderを混同していませんか?
全然別のものです。 一つのコネクションで同時に開けるDataReaderは一つです。 よって、都度Open,Closeする必要があるでしょう。 DataAdapterを利用した場合はJittaさんの説明のとおりです。 ちなみに、コネクションが必要になる直前にOpenし、使い終わった直後に確実にCloseするようにすると良いと思います。 _________________ 「伝える」とは「人に云う」と書く。 http://d.hatena.ne.jp/NAL-6295/ | ||||
|
投稿日時: 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-08-23 13:25
>NAL-6295さん
おっしゃるとおりに、DataAdapterとDataReaderを混同してました。 私が知りたかったのはDataReaderのほうでした。 やはりその都度Open、Closeする必要があるようですね。 それでは、 以下のようなケースの場合はDataAdapterとDataReaderのどちらが適切なのでしょうか? ■バッチ処理のようなDBから情報を読んでは更新を繰り返す場合 | ||||
|
投稿日時: 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 | ||||
|
投稿日時: 2004-08-23 17:30
DataReaderを使うなら、1つの読み込み動作を完了させた後、次の動作を行わなければなりません。先に「SQL*PLUSでコマンドを発行するようなもの」と書いたとおりです。SELECTすると、その結果をすべて表示してしまうまで、次のコマンドは発行できません。 そこで、「データを読み取る」という動作と、「必要に応じてデータを加工する」という動作、「加工したデータをデータベースに書き戻す」という動作の3つに分解します。そうすると、手順を次のようにできます。 while (データがある) { DataReader.Read(); 読み込んだデータをDataTableに入れる AcceptChange() データを加工する } DataAtapter.Update(DataTable); AcceptChangeするのは、DataTable.Addで、RowStateがINSERTEDになったと思うから。その後に加工=編集することで、UPDATEDになります。 #DataSetの使い道は、表示だけではないですよ |