C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: OleDb接続時のハンドル定義の方法


(過去ログ 99 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■58921 / inTopicNo.1)  OleDb接続時のハンドル定義の方法
  
□投稿者/ エル (1回)-(2011/05/04(Wed) 15:17:09)

分類:[ASP.NET (VB)] 

2011/05/04(Wed) 15:19:07 編集(投稿者)

質問させてください。

今VWD2008(ASP.NET3.5)とAccess2003でWebアプリを作成しています。
(サーバはWindowsServer2003です。)

AccessにOleDbで接続しデータをハンドリングする時のハンドルを
定義する際にUsingを使う場合とDimを使う場合の使い分けについて
教えてください。

msdnのサンプルは、OleDbConnectionのハンドルにのみUsingを使用。
OleDbCommandとOleDbDataReaderのハンドルはDimを使用。
UsingとDimの使い分けの方法とその理由を教えて欲しいです。
http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbdatareader(v=vs.80).aspx

OleDbConnection、OleDbCommandとOleDbDataReaderのハンドル全てにUsingを使用した例
http://adonetvb.com/AdoNetExecuteReaderOle.html

UsingがなかったASP.NET1.x時代にはOleDbConnection、OleDbCommandと
OleDbDataReaderのハンドル全てDimを使用していました。
http://asp35.com/adoAccess/Chapter1/ch1-09.aspx

私は、OleDbConnection、OleDbCommandとOleDbDataReaderのハンドル全て
にUsingを使用するのが良いと思うのですが、msdnのサンプルが使い分けて
いるのが気になります。使い分けの理由を理解し、処理速度のなるべく
速い安定した信頼性の高いコードを書きたいです。
引用返信 編集キー/
■58947 / inTopicNo.2)  Re[1]: OleDb接続時のハンドル定義の方法
□投稿者/ ピートモス (1回)-(2011/05/06(Fri) 12:30:32)
OleDbConnectionではOpenしたら最後はCloseする必要がありますが、
Usingを使えば、Usingを抜けると自動的にCloseメソッドが実行されます。
このため、OleDbConnectionがUsingで使われているのは、明示的にClose()を
コード上に書かなくてもコネクションのクローズが実行されることを期待しているのでしょう。

処理が終わったら確実にCloseしたい場合(例えばファイルやメモリのストリームなど)には、
Usingを使うのが確実でしょうし(1.xでtry-catch-finallyを行う代わりとして)、
それ以外のIDisposableなクラスで、処理が終わったらリソースの解放を明示的に行いたい場合は、
Usingを使えばいいのではないでしょうか?
引用返信 編集キー/
■58966 / inTopicNo.3)  Re[2]: OleDb接続時のハンドル定義の方法
□投稿者/ エル (2回)-(2011/05/06(Fri) 18:18:13)
No58947 (ピートモス さん) に返信
> OleDbConnectionではOpenしたら最後はCloseする必要がありますが、
> Usingを使えば、Usingを抜けると自動的にCloseメソッドが実行されます。
> このため、OleDbConnectionがUsingで使われているのは、明示的にClose()を
> コード上に書かなくてもコネクションのクローズが実行されることを期待しているのでしょう。
>
> 処理が終わったら確実にCloseしたい場合(例えばファイルやメモリのストリームなど)には、
> Usingを使うのが確実でしょうし(1.xでtry-catch-finallyを行う代わりとして)、
> それ以外のIDisposableなクラスで、処理が終わったらリソースの解放を明示的に行いたい場合は、
> Usingを使えばいいのではないでしょうか?

ピートモスさんお返事ありがとうございます。
Usingは、Usingを抜けると自動的にCloseメソッドが実行される、とても便利で
高機能な機能であると考えています。
msdnのサンプルコード↓でもOleDbConnectionにはUsingを使用しています。
http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbdatareader(v=vs.80).aspx
しかし、同じ事がOleDbDataReaderでも言えるのですが、
このmsdnのサンプルコードでは、OleDbDataReaderではUsingを使用せずDim−Closeで
記述しています。Closeコマンドを記述しています。

msdnのサンプルコードではOleDbConnectionではUsingを使い、OleDbDataReaderでは、
Dim−Closeを使い、使い分けているのです。この使い分けている理由と、Usingと
Dim−Closeの使い分けの方法を理解できたらと考えています。msdnのサンプルコード
がOleDbConnection、OleDbCommandとOleDbDataReaderの3つ全てでUsingを使っていれ
ば納得するのですが、使い分けています。msdnが使い分けているのに理由があると思
うのです。使い分け方の基準をご指導頂けるとありがたいです。よろしくお願いします。
引用返信 編集キー/
■58968 / inTopicNo.4)  Re[3]: OleDb接続時のハンドル定義の方法
□投稿者/ ピートモス (1回)-(2011/05/06(Fri) 19:19:16)
No58966 (エル さん) に返信
> msdnのサンプルコード↓でもOleDbConnectionにはUsingを使用しています。
> http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbdatareader(v=vs.80).aspx
> しかし、同じ事がOleDbDataReaderでも言えるのですが、
> このmsdnのサンプルコードでは、OleDbDataReaderではUsingを使用せずDim−Closeで
> 記述しています。Closeコマンドを記述しています。

例えば、上記サイトには以下のように記述があります。

> OleDbDataReader を閉じた後に呼び出すことができるのは、IsClosed プロパティと RecordsAffected プロパティだけです。
> RecordsAffected プロパティは、OleDbDataReader が存在している間はいつでも呼び出すことできますが、正しい戻り値を得るために、
> RecordsAffected の値を取得する前には、必ず Close を呼び出してください。

Close後に参照できるメンバがあるという説明があるため、あえてOleDbDataReaderのCloseメソッドを使っているのかも知れません。
(Usingで閉じたらこれらメンバにはアクセスできませんしね。)
ただし、OleDbDataReaderをCloseした後にこれらのメンバを参照する必要がないならば、Usingを使った方がいいのではないでしょうか?
それに、インスタンスのDisposeという観点においてはIDisposableなクラスにおいてはUsingを使うように統一した方がすっきりするかも知れません。

そもそも、msdnのサンプルは色々な人が作成していると思いますので、厳密に統一されているという保証もないでしょうし、
あまり深く考えずに、あくまでもサンプルだととらえればいいような気もします。
引用返信 編集キー/
■58986 / inTopicNo.5)  Re[4]: OleDb接続時のハンドル定義の方法
□投稿者/ エル (3回)-(2011/05/08(Sun) 11:15:41)
No58968 ( ピートモス さん) に返信
ピートモスさん丁寧な解説ありがとうございます。

OleDbCommandクラス、OleDbDataReaderクラスの機能・仕様を理解して
UsingとDim−Closeを使い分ける必要がある事がわかりました。
また、msdsのサンプルコードもこれらの事を配慮し記述されてあるサンプル
コードであると理解しました。
ご指導ありがとうございました。

> CommandText プロパティをリセットして、OleDbCommand オブジェクトを再利
> 用できます。ただし、新規コマンドまたは以前のコマンドを実行する前に、
> OleDbDataReader を閉じる必要があります。

> OleDbDataReader を閉じた後に呼び出すことができるのは、IsClosed プロパ
> ティと RecordsAffected プロパティだけです。RecordsAffected プロパティは、
> OleDbDataReader が存在している間はいつでも呼び出すことできますが、正し
> い戻り値を得るために、RecordsAffected の値を取得する前には、必ず Close
> を呼び出してください。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -