SqlDataReader.Закрыть не закрывается немедленно

#sqldatareader

#sqldatareader

Вопрос:

Я использую SqlDataReader для чтения ограниченного количества строк из таблицы, чтобы я мог поместить их в gridview. Как только я прочитал нужное мне количество строк, я хочу выйти; однако читатель.Закрыть (или считыватель.Dispose) возвращается не сразу.

Я делаю это, чтобы показать сравнение различных способов чтения данных, поэтому я не ищу альтернативные решения. Я просто хочу завершить код, когда у меня будет нужное количество строк.

Вот код:

 SqlDataReader Reader = null;
SqlConnection Connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ZipData"].ConnectionString);

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ZipCode", System.Type.GetType("System.String")));
dt.Columns.Add(new DataColumn("City", System.Type.GetType("System.String")));
dt.Columns.Add(new DataColumn("State", System.Type.GetType("System.String")));

try
{
    string Query = string.Format("{0} WHERE ZipCode Like @ZipCode AND City Like @City AND State Like @State ORDER BY {1}", SQLQuery, (string.IsNullOrEmpty(sortType)) ? "ZipCode" : sortType);
    SqlCommand Command = new SqlCommand(Query, Connection);
    Command.Parameters.Add(new SqlParameter("@ZipCode", filter.Zip   "%"));
    Command.Parameters.Add(new SqlParameter("@City", filter.City   "%"));
    Command.Parameters.Add(new SqlParameter("@State", filter.State   "%"));

    Connection.Open();
    Reader = Command.ExecuteReader();
    int CurrentRow = 0;
    DataRow row;
    while (Reader.Read())
    {
        if (CurrentRow >= startRowIndex)
        {
            if (dt.Rows.Count > maximumRows) break;
            row = dt.NewRow();
            row["ZipCode"] = (string)Reader["ZipCode"];
            row["City"] = (string)Reader["City"];
            row["State"] = (string)Reader["State"];
            dt.Rows.Add(row);
        }
        CurrentRow  ;
    }
    Reader.Close();
}
catch (SqlException ex)
{
    ErrorMessage = ex.Message;
}
finally
{
    Connection.Close();
}
return dt;
  

Ответ №1:

После просмотра документации Microsoft вы можете ускорить закрытие соединения, отменив команду sql. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.close.aspx

Итак, вы должны иметь возможность добавить это перед закрытием, чтобы достичь желаемого результата. Команда.Отмена()

Ответ №2:

Я знаю, что вам не нужны альтернативные решения, но почему бы не использовать SELECT TOP 200 или любой другой maximumRows в SQL? Это улучшило бы практически все; меньше нагрузки на SQL Server, сеть и локальный компьютер…

После тестирования вашего кода я не увидел проблем ни с закрытием программы чтения, ни с подключением. Можете ли вы лучше описать проблему?

Комментарии:

1. Файл ZIP-кодов содержит 87 000 строк. Если я выберу top N *, сортировка или фильтр не найдут все строки. Если я выберу *, считыватель. Строка Close() приостанавливается на срок до 15 секунд. Мое SQL-соединение осуществляется по VPN-ссылке T1, поэтому, если вы будете тестировать это там, где SQL Server находится очень близко, вы можете увидеть эту проблему.