2012-02-24 8 views
1

大したことではなく、きちんとしているために、「作成して開く」方法はありますかSqlConnectionSqlDataReaderを開くときにネストすることを避ける方法はありますか?

私は単純にこのコードを書いた:

using (var strConnection = new SqlConnection(sourceConnection)) 
using (var strCommand = new SqlCommand(query, strConnection)) 
using (var reader = strCommand.ExecuteReader()) 
{ 
    ... 
} 

接続が開いていないので、もちろん3行目で失敗します。
接続を開くことでネストすることを避けるためのきれいな方法がありますか?

using (var strConnection = new SqlConnection(sourceConnection)) 
{ 
    strConnection.Open(); 
    using (var strCommand = new SqlCommand(query, strConnection)) 
    using (var reader = strCommand.ExecuteReader()) 
    { 
     ... 
    } 
} 
+0

あなたは本当にただ一つのコマンドのための接続が必要です。この

チェック!たぶん、接続を長時間開いたままにする必要があります。 – svick

答えて

1

いい質問で、私の考えはSqlConnectionのための拡張-方法です。

public static class SqlExtensions { 
    public static SqlConnection OpenAndReturn(this SqlConnection con) { 
     try { 
      con.Open(); 
      return con; 
     } catch { 
      if(con != null) 
       con.Dispose(); 
      throw; 
     } 
    } 
} 

使用法:

using(var strConnection = new SqlConnection("CONNECTION").OpenAndReturn()) 
using(var strCommand = new SqlCommand("QUERY", strConnection)) 
using(var reader = strCommand.ExecuteReader()) { 
    //...  
} 
+0

良い考え!私はこれが好きで、素敵でシンプルです。 – Coxy

+2

このアプローチを使用することは、実際には推奨されていません。もし 'OpenAndReturn'で例外が発生すると、接続は破棄されません。つまり、この場合、 'using'ブロックは' OpenAndReturn'から返されたオブジェクトを保護し始めます。新しいSqlConnection(...)によって生成されたオブジェクトではありません。 (もちろん、これを補うために独自の 'try ... catch ... Dispose'ロジックを使って拡張メソッドを強化することができます) – LukeH

+0

これは受け入れられる答えですか? – Malmi

1

はそのようなことについてはどう:

class SqlHelper : IDisposable 
{ 
    public SqlHelper(string connectionString, string query) { ... } 

    public SqlConnection Connection { get; set; } 
    public SqlCommand Command { get; set; } 

    // SQL querying logic here 
    public void Execute() { ... } 

    /** IDisposable implementation **/ 
} 

とあなたのコード

using (SqlHelper sql = new SqlHelper(sourceConnection, query)) 
{ 
    var reader = sql.Execute(); 
    ... 
} 
+0

そして、あなたはどのように 'Dispose()'をしますか? – svick

+0

@svickそれは良い点です、多分あなたは、リーダーをヘルパー内から処分できるように、代理人として 'using'でブロックを渡すことができます。 – Guillaume

関連する問題