河端善博 ログ

RSS 開発、セキュリティ、日記

)
Please read my disclaimer.

System.Data.SqlClient ネームスペースのクラスの Dispose

System.Data.SqlClient名前空間

SqlClient のクラスの中で、Disposeがどのように対応しているのかを確認しました

クラスDispose
SqlClientPermission×
SqlClientPermissionAttribute×
SqlCommand○
SqlCommandBuilder○
SqlConnection○
SqlDataAdapter○
SqlDataReader○
SqlError×
SqlErrorCollection×
SqlException×
SqlInfoMessageEventArgs×
SqlParameter×
SqlParameterCollection×
SqlRowUpdatedEventArgs×
SqlRowUpdatingEventArgs×
SqlTransaction○

※ヘルプでは、SqlDataReader にDispose がありませんが、IDisposeインターフェースを実装していますので、Disposeすることができます。
利用時には、using を使って適切なタイミングで Dispose する必要があります。
例:
try
{
  using (SqlConnection c = new SqlConnection("..."))
  {
    using (SqlCommand m = new SqlCommand())
    {
       ...
    }
  }
}
catch (SqlException exp)
{
  ...
}
※using は、using (..., ...) と複数のならべて書くこともできます。

11/12/2003 5:46 PM | Comments[4] | #SQL Server #.NET

11/12/2003 10:39 PM

try
{
using (SqlConnection c = new SqlConnection("..."),
SqlCommand m = new SqlCommand())
{

}
}
catch( SqlException excep )
{
}

 using にはカンマ区切りで複数の宣言を入れられます。
 のでネストはそれほど深くなくて済みますね。

 catch で Exception とするのは良くないでしょう。
(無関係の例外がつかまった場合にどうすれば良いか困った事になります。)

 特に、ArgumentNullExceptionとかを間違えてつかんでしまうとデバッグの効率が落ちますです。

菊池

11/12/2003 10:41 PM

あ、肝心な事を書き忘れた。

 SqlDataReaderもIDisposableです。

菊池

11/12/2003 11:11 PM

菊地さん、ありがとうございます。更新しました。
SqlDataReader は、ヘルプには Dispose がありませんね。ヘルプのミスと思います。

河端善博

11/13/2003 12:5 AM

えと、クラスの概要の所では記述されてますね。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfSystemDataSqlClientSqlDataReaderClassTopic.asp
--
public sealed class SqlDataReader : MarshalByRefObject,
IEnumerable, IDataReader, IDisposable, IDataRecord
--

 Closeメソッドが付いているのでインターフェースの明示実装によってDisposeが実装されているのだと思いますが、インターフェースの明示実装の欄にも無いですね。
#ILDASMしてみるとhidebysigなので明示実装ですね。

 SqlDataReaderがCloseされるまでConnectionがロックされてしまうので、SqlDataReaderの後始末忘れが一番被害が大きいとも言えますね。

菊池


Subscribe to my RSS feed.

Powered by BlogX