2014-02-19 21 views
2
DataTable dt= new Datatable(); 
try { 
    SqlCommand Cmd = new SqlCommand("sp_getData",SqlCon); 
    SqlCommand.CommandType= CommandType.StroedProcedure; 
    SqlCon.Open(); 
    sqlDataReader dr= cmd.ExecuteReader(); 
    dt.Load(dr); 
    SqlCon.Close(); 
} 
catch(Exception ex) { 
} 
finally{ 
    dt.Dispose() // 
} 

return dt; 

返回這段代碼合法?......我的方法返回了DataTable對象,所以調用dispose意志保留值後?? ..請解釋一下..處置DataTable對象,我需要從我的方法

+1

你試圖讓在這段代碼中儘可能多的問題?請閱讀「IDisposable」和「使用塊」。你正在離開你的當地人,並且處理你正在返回的唯一事情。 – nvoigt

+0

任何人出於der ?? ..請倒入你的seguegestions .... –

+0

這是不合法的。看到這個姿勢 - http://stackoverflow.com/questions/18869079/datatable-dispose-will-make-it-remove-from-memory –

回答

3

這會給你想要的東西:

public DataTable getDataTable() 
    { 
     using (SqlConnection sqlCon = new SqlConnection("connectionString")) 
     using (SqlCommand cmd = new SqlCommand("sp_getData", sqlCon)) 
     { 
      try 
      { 
       cmd.CommandType = CommandType.StoredProcedure; 
       sqlCon.Open(); 
       using (SqlDataReader dr = cmd.ExecuteReader()) 
       { 
        DataTable dt = new DataTable(); 
        dt.Load(dr); 
        return dt; 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
      return null; 
     } 
    } 
3

不會。您將返回已處置的對象。

如果您要返回IDisposable,那麼期望它是調用者在完成對象處置時負責處理該對象是完全正常的。因此,您應該原樣返回DataTable對象,並讓調用代碼處置它。

通常,這可以通過使用塊來完成。例如:

class MyDisposableObject : IDisposable { /*...*/ } 

public MyDisposableObject MakeMeAnObject() { return new MyDisposableObject(); } 

public void Main() 
{ 
    using(var o = MakeMeAnObject()) 
    { 
     o.Foo = 1; 
     o.Bar = 2; 
     o.FooBar(); 
    } 
} 

注我看到你的片段,你是不是處置,但應該是一些地方IDisposable對象。你也在吞嚥異常。

1

這將返回一個不是你想要的對象。

你可以做的一件事是傳遞一個委託,它將允許你在DataTablr上工作而不返回它,並且仍然在原始數據方法中處理。

僞代碼:

public void GetSomeData(Action<DataTable> processDataTableAction) 
{ 
    try 
    { 
     ... (get the data) 
     processDataTableAction(dt); 
    } 
    catch 
    { 
     // handle exceptions 
    } 
    finally 
    { 
     dt.Dispose(); 
    } 
} 

然後在其他地方調用該函數代碼:

GetSomeData(dt => { 
    // do stuff with dt 
});