6

私が見つけることができるすべてのオンライン例はusing、使用中の括弧内で直接 C# のインスタンス化を行います。

using (var cnx = new SqlConnection()) { }

以下は同じように動作するはずだと思いますが、まだリソースがロックされているようです:

SqlConnection GetConnection() { return new SqlConnection(); }
void foo()
{
    using (var cnx = GetConnection()) { }
}

プログラムをステップ実行して、using の右中括弧の次の行に到達すると、SQL Server Management Studio を使用して任意の方法でデータベースを変更できると期待していましたが、できませんでした。アプリを閉じると、エラーはなくなります。

これは SQL に分離されていません。私はまた、この方法でファイル ストリームを開くことでこれを経験しました。つまり、usingブロックを通過しますが、OS は外部アプリがファイルを変更することを許可しません。

using契約の一部に違反していますか?

4

3 に答える 3

5

適切なリソースを返すメソッドを使用することは絶対に問題ありません。特に、これはかなり一般的です。

using (var writer = File.CreateText(path))
{
}

(およびの同様の方法File)。

基本的に、これはメソッドの呼び出しやコンストラクターの呼び出しとは関係ありません。何か他の問題があるはずです。問題を示す短いが完全なプログラムを作成できれば(理想的にはデータベースではなくファイルを使用して) 、問題が何であるかだけでなく、何問題であるかを見つけるのに役立つ可能性があります:)

于 2013-02-13T16:04:55.540 に答える
3

接続プールが有効になっている場合、「Dispose」は必ずしも接続を物理的に閉じるとは限りません。

于 2013-02-13T16:13:49.863 に答える
0

私はいつもそのようなコードを使用しています:

SqlConnection GetConnection() 
{ 
    return new SqlConnection(); 
}

void foo()
{
    using (var cnx = GetConnection()) 
    { 
        cnx.Open();
    }
}

本当に確認したい場合はcnx.Close();、閉じ括弧の前に呼び出してください。Disposeただし、への呼び出しが自動的に接続を閉じるため、これは私の場合は必要ありませんでした。

于 2013-02-13T16:09:11.350 に答える