SQLDataReader.Close不会立即关闭

时间:2011-10-21 17:48:31

标签: sqldatareader

我正在使用SQLDataReader从表中读取有限数量的行,以便我可以将它们分页到gridview中。一旦我读完了我想要的行数,我就想退出;但是Reader.Close(或Reader.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;

2 个答案:

答案 0 :(得分:4)

查看Microsoft的文档后,您可以通过取消sql命令来加快关闭连接。 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.close.aspx

因此,您应该能够在关闭之前添加此项以实现您期望的结果。 Command.Cancel()

答案 1 :(得分:0)

我知道您不想要其他解决方案,但为什么不使用SELECT TOP 200或SQL中的任何maximumRows?这将改善几乎所有事物;减少SQL Server,网络和本地计算机上的负载......

在测试代码后,我没有看到关闭阅读器和连接的问题。你能更好地描述这个问题吗?