C # Как перевести мой sqlDataReader в автономный режим? - PullRequest
1 голос
/ 27 октября 2011

У меня утечка памяти из-за неправильного закрытия соединения. Это связано с использованием глобальной функции для доступа к базе данных (с разными строками SQL), но я возвращаю 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.
}

или, может быть, действительный способ закрытия всего этого вне метода (после того, как я получу доступ к тому, что мне нужно)?

Ответы [ 4 ]

3 голосов
/ 27 октября 2011

Вы можете просто вернуть DataTable вместо SqlDataReader.Это заполнит таблицу вашими данными, и вы можете закрыть соединения, прежде чем метод завершит свое выполнение.

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

Это может стоить прочитать.

2 голосов
/ 27 октября 2011

Попробуйте метод 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;
}
2 голосов
/ 27 октября 2011

Не возвращайте читателя, вместо этого верните заполненный DataTable.

1 голос
/ 27 октября 2011

Вы можете использовать что-то вроде DataSet, обеспечивающее автономный доступ к вашим данным. Некоторые примеры здесь - http://msdn.microsoft.com/en-us/library/ms971499.aspx

или

Этот вопрос предоставляет ряд методов для извлечения данных из устройства чтения данных и их сохранения в памяти - Как я могу легко преобразовать DataReader в список ?

...