c#如何让我的sqlDataReader脱机?

本文关键字:sqlDataReader 脱机 我的 | 更新日期: 2023-09-27 18:12:37

我有一个内存泄漏,由于没有正确关闭连接。这是由于使用全局函数访问数据库(使用不同的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.
}

或者可能是在方法外部关闭它的有效工作方式(在我访问了我需要的内容之后)?

c#如何让我的sqlDataReader脱机?

尝试数据表。Load Method 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;
}

您可以只返回DataTable而不是SqlDataReader。这将用您的数据填充表,并且您可以在方法结束执行之前关闭连接。

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

不要返回reader,而是返回一个填充的DataTable

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

这个问题提供了许多从数据阅读器中取出数据并将其存储在内存中的方法——我如何轻松地将数据阅读器转换为列表?