我有一个内存泄漏,因为没有正确关闭连接。这是由于使用了一个全局函数来访问数据库(使用不同的sql字符串),但是我传回了一个sqldatareader。I不能在方法中关闭它,也不能关闭到DB的连接,因为它关闭了对数据的访问!,并且它没有从这个方法外部正确地关闭。:(
无论如何,是我可以获得所需表的方式,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.
}
或者是一种有效的工作方式,在方法之外(在我访问了我需要的东西之后)关闭它?
发布于 2011-10-27 00:47:24
试试DataTable.Load法方法:
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;
}
发布于 2011-10-27 00:42:35
您可以只返回一个DataTable
而不是一个SqlDataReader
。这将用数据填充表,并且可以在方法结束执行之前关闭连接。
private DataTable GetDataTable(String sql)
{
SqlDataAdapter da = new SqlDataAdapter(sql, connection);
DataSet ds = new DataSet();
da.Fill(ds);
return ds.Tables[0];
}
这可能值得一读。
发布于 2011-10-27 00:42:00
不要返回读取器,而是返回一个填充的DataTable
。
https://stackoverflow.com/questions/7913461
复制