2012-02-24 86 views
1

沒有什麼大不了的,但爲了整潔起見,有什麼辦法可以「創建並打開」SqlConnection任何避免在打開SqlDataReader時嵌套使用的方法?

我天真地寫了這個代碼:

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 2012-02-24 07:37:26

回答

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 2012-02-24 07:54:47

+2

不推薦使用這種方法:如果在OpenAndReturn中發生異常,則不會處理連接。也就是說,在這種情況下,'using'塊在從'OpenAndReturn'返回時開始保護對象,而不是由'new SqlConnection(...)'創建。 (當然,你可以用自己的'try ... catch ... Dispose'邏輯來補充這個擴展方法。) – LukeH 2012-02-24 11:04:40

+0

這是一個可以接受的答案嗎? – Malmi 2012-02-26 10:14:00

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

你如何'處理()'讀者? – svick 2012-02-24 07:38:17

+0

@svick這是一個很好的觀點,也許你可以將'using'中的代碼塊作爲委託來傳遞,這樣讀者就可以從幫助器中被丟棄了。 – Guillaume 2012-02-24 07:55:29

相關問題