C#如何使我的sqlDataReader脱机?

时间:2011-10-27 08:35:48

标签: c# database memory-leaks sqldatareader

我有内存泄漏,原因是没有正确关闭连接。这是因为使用全局函数来访问数据库(使用不同的sql字符串),但是我传回了sqldatareader。 我无法在方法中关闭它,也不能连接到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.
}

或者可能是一种有效的工作方式,在方法之外关闭它(在我访问了我需要的东西之后)?

4 个答案:

答案 0 :(得分: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可能值得一读。

答案 1 :(得分:2)

请勿返回阅读器,而是返回已填充的DataTable

答案 2 :(得分: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;
}

答案 3 :(得分:1)

您可以考虑使用DataSet之类的内容来提供对数据的离线访问。这里有一些例子 - http://msdn.microsoft.com/en-us/library/ms971499.aspx

这个问题提供了许多方法,可以将数据从datareader中取出并存储在内存中 - How can I easily convert DataReader to List<T>?