RSS 開発、セキュリティ、日記
) Please read my disclaimer.
try
{
using (SqlConnection c = new SqlConnection("..."))
using (SqlCommand m = new SqlCommand())
...
}
catch (SqlException exp)
5:46 PM | Comments[4] | #SQL Server #.NET
菊池
河端善博
Name
EMail
Homepage
Remember Me
Comment (HTML not allowed)
SqlClient のクラスの中で、Disposeがどのように対応しているのかを確認しました
※ヘルプでは、SqlDataReader にDispose がありませんが、IDisposeインターフェースを実装していますので、Disposeすることができます。
利用時には、using を使って適切なタイミングで Dispose する必要があります。
例:
try{{{catch (SqlException exp){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の後始末忘れが一番被害が大きいとも言えますね。
菊池