2013-03-20 69 views
1

我正在嘗試使用Using()語句和SqlConnection使用屬性時連接狀態關閉

我做了SqlConnection頁屬性是這樣的...

public SqlConnection baseConnection 
{ 
    get { return new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); } 
} 

然後創建using()聲明是這樣的...

using (baseConnection) 
      { 
       SqlCommand select = new SqlCommand("SELECT * FROM TABLE", baseConnection); 
       baseConnection.Open(); 
       SqlDataReader reader = select.ExecuteReader(); 

       //... other irrelevant code 
      } 

但代碼運行時我得到一個異常

異常詳細信息:System.InvalidOperationException:ExecuteReader需要open和ava可用連接。連接的當前狀態已關閉

我瞭解異常,我不明白的是爲什麼當我用baseConnection.Open()打開它時連接未打開?

我在整個站點使用這個連接,我想把它作爲一個頁面屬性放在一個自定義的基類中,所以我不必繼續輸入它。這是不允許的?

回答

6

問題,我在你的榜樣找到

你得到新的SqlConnection對象每次申請baseConnection財產

問題的代碼:

public SqlConnection baseConnection 
{ 
    get { return new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); } 
} 

更正後的代碼

private SqlConnection _baseConnection; 
public SqlConnection BaseConnection 
{ 
    get { return _baseConnection = _baseConnection ?? new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); } 
} 

這裏return _baseConnection = _baseConnection ?? new SqlConnection()使用空Coaleasing運營商從C#??即如果_baseConnection變量爲null,這將創造新的實例。

我的假設
BaseConnection屬性在一些BaseClass定義和派生類不是在子派生類進一步擴展。通過這種方式,您可以爲每個派生類類型使用一個SqlConnection。

+1

@Aniket:由於附着到的SelectCommand的baseConnection是不是該被打開 – jbl 2013-03-20 10:10:05

+0

我不認爲這是一個好主意的人。在連接上調用Dispose並不會使其成爲null。因此,這隻會工作一次(然後創建),並在其餘時間失敗。 – 2013-03-20 10:11:20

+0

@jbl嗯,........ – 2013-03-20 10:11:23

1

你的代碼應該是:

using (var myConnection = baseConnection) 
      { 
       SqlCommand select = new SqlCommand("SELECT * FROM TABLE", myConnection); 
       myConnection .Open(); 
       SqlDataReader reader = select.ExecuteReader(); 

       //... other irrelevant code 
      } 
0
string sQry = "Select * from TestEmp"; // Select Table 
    SqlCommand cmd = new SqlCommand(sQry, conDB);// Pass Sql Query & Sql Connection in Sql Command 
    conDB.Open();// Open DB 
    SqlDataAdapter objAdapter = new SqlDataAdapter(cmd); // Create DisConnected Architecture 
    DataTable objTable = new DataTable(); // Create Data Table 
    objAdapter.Fill(objTable);// Fill Data Table using Adapter Object 
    dgvDisplay.DataSource = objTable; // Display select result in DataGridView Box 
    conDB.Close(); // Close Connection