0

次のコードパターンが気になります:

    static SqlConnection getcon()
    {
        SqlConnection con = new SqlConnection("data source=foobar..");
        con.Open();

        // is con Disposed automatically or will it leak and live 
        // forever when exception is thrown?

        throw new Exception("exception");
        return con;
    }

    static void Main(string[] args)
    {
        try 
        {
            using (var scope = new TransactionScope())
            using (var con = getcon())
            using (var cmd = new SqlCommand("UPDATE SomeTable SET Column1 = 'test'", con))
            {                   
                cmd.ExecuteNonQuery();

                scope.Complete();
            }
        }
        catch     
        {
        }
    }

これは安全な使用方法ですかSqlConnection(メソッドから接続を取得しますgetcon())? 例外がスローされたときに関数が終了した後に破棄されますか、それとも永久に存続しますか?

このGetCon()メソッドが必要な理由は、コードを短縮し、接続の作成と開始を 1 行にラップすることです ( using (var con = getcon())..)

4

3 に答える 3

2

あなたが getcon メソッドを書いた方法 (特に何かをテストするためにそれを行ったと思います) では、con は例外がスローされた瞬間に解放されます。「return con;」以来 スローした例外の後、呼び出し元のコードに返されることはなく、 getcon が終了するとすぐに解放されます (スコープ外になるため)。

于 2013-08-05T20:31:14.320 に答える
1

jaadooviewer さんの回答は正しいと思いますが、getcon メソッドで try/catch ブロックを使用することで、質問を完全に回避できるようです。

try
{
    SQLConnection con = new SQLConnection("...");
    con.Open();
    if (/*condition*/)
        throw new Exception("Exception Condition Satisfied");
}
catch (Exception ex)
{
    con.Dispose();
    throw ex;
}
return con;
于 2013-08-05T20:37:49.817 に答える