2011-10-27 64 views
1

由於未正確關閉連接,導致內存泄漏。這是由於使用全局函數來訪問數據庫(使用不同的SQL字符串),但我傳回了一個sqldatareader。 我無法關閉此方法,也無法連接到數據庫,因爲它關閉了對數據的訪問!它不能從此方法之外正確關閉。 :(C#如何使我的sqlDataReader脫機?

反正是有辦法,我可以把所需的表,該SqlDataReader的授權訪問,離線。所以,我可以關閉所有的連接,但仍然可以訪問表。

注意,不同的表返回等不同領域的存在。我不想每次都我嘗試複製代碼,並連接。

private SqlDataReader OpenDataStream(String sql) 
{ 
    SqlCommand sqlComm = new SqlCommand(); 
    sqlComm.Connection = new SqlConnection(); 
    sqlComm.Connection.ConnectionString = @"Myconnectionstring"; 
    sqlComm.CommandText = sql; 
    sqlComm.Connection.Open(); 
    SqlDataReader data = null; 
    data = sqlComm.ExecuteReader(); 

    return data; 

    // Closing data here, or connection, results in returned object inaccessable. 
} 

或者可能關閉了這一切的方法之外(我已訪問後的一個有效的工作方式是什麼我需要)?

+0

[使用語句中的DataLayer返回DataReader]的可能重複(http://stackoverflow.com/questions/850065/return-datareader-from-datalayer-in-using-statement) – nawfal

回答

2

嘗試DataTable.Load Method方法:

private DataTable OpenDataStream(String sql) 
{ 

    DataTable dt = new DataTable(); 

    SqlCommand sqlComm = new SqlCommand(); 
    sqlComm.Connection = new SqlConnection(); 
    sqlComm.Connection.ConnectionString = @"Myconnectionstring"; 
    sqlComm.CommandText = sql; 
    sqlComm.Connection.Open(); 
    SqlDataReader data = null; 
    data = sqlComm.ExecuteReader(); 

    dt.Load(data); 

    data.Close(); 

    return dt; 
} 
2

不要退還閱讀器,而是返回填充的DataTable

3

您可以只返回一個DataTable而不是SqlDataReader。這將填充表中的數據,並且可以在方法結束執行前關閉連接。

private DataTable GetDataTable(String sql) 
{ 
    SqlDataAdapter da = new SqlDataAdapter(sql, connection); 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 
    return ds.Tables[0]; 
} 

This可能值得一讀。