2014-04-30 54 views
3

當我從Visual Studio 2013分析我的代碼時,出現了一些警告「不要多次處理對象」,它還指出對象conn在對象中多次處理,但據我所知,如果我在對象中多次使用這個對象比我不能實現我的目標。 所以請告訴我如何刪除此警告?代碼分析 - 不要多次處理對象

這裏是我的代碼:

private void GetData() 
     { 
      DataTable dt = new DataTable(); 
      _connString = ConfigurationManager.AppSettings["connString"]; 
      using (SqlConnection conn = new SqlConnection(_connString)) 
      { 
       conn.Open(); 
       SqlCommand cmd = new SqlCommand("select * from ref_CourseRegistration_Users", conn); 
       cmd.CommandType = CommandType.Text; 
       SqlDataAdapter da = new SqlDataAdapter(cmd); 
       DataSet ds = new DataSet(); 
       da.Fill(ds); 
       conn.Close(); 
       if (ds.Tables[0].Rows.Count > 0) 
       { 
        grdUsers.DataSource = ds; 
        grdUsers.DataBind(); 
       } 
      } 
     } 

這是我分析的截圖: enter image description here

+0

這裏如果你正在使用'(SqlConnection conn = new SqlConnection(_connString))' – tarzanbappa

+1

你也應該使用''Dispose''''SqlCommand。 – StuartLC

回答

6

在這裏,如果你正在使用using語句

using (SqlConnection conn = new SqlConnection(_connString)) 

無需關閉連接再次 所以conn.Close();不是必需的。

它會自動處理對象。

+0

但爲什麼conn.Close();不需要?如果打開它後不好關閉連接? – Wasay

+1

@Wasay - 'Close()'和'Dispose()'在'SqlConnection'對象上做同樣的事情,'using'語句自動調用'Dispose()'。請參閱['Close'](http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.close.aspx):「** Close **和** Dispose **在功能上相當於「 –

+1

@Damien_The_Unbeliever - 絕對關閉和處置*不*做同樣的事情。只需查看已反編譯的源代碼即可!發生的是Dispose本身會調用Close。 – Jamiec

3

當您在使用塊中打開連接時,using塊將自動調用Dispose()方法,同時保留使用塊範圍。

所以,conn.Close();在您的代碼中不是必需的。

+0

你的意思是說它會自動調用*'close()'*? – Jamiec

+0

@Jamiec - 不,它會自動調用Dispose。但是在'SqlConnection'對象上,這兩種方法在功能上是等效的。 –