2011-10-21 108 views
1

我正在使用SQLDataReader從表中讀取有限數量的行,以便可以將它們分頁到一個gridview中。一旦我閱讀了我想要的行數,我想退出;但Reader.Close(或Reader.Dispose)不會立即返回。SQLDataReader.Close不立即關閉

我這樣做是爲了顯示讀取數據的各種方式的比較,所以我沒有尋找替代解決方案。我只想在我有所需的行數時退出代碼。

下面是代碼:

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; 

回答

0

我知道你不想替代解決方案,但爲什麼不使用SELECT TOP 200或任何maximumRows是在SQL?這會改善一切; SQL Server,網絡和本地計算機上的負載更少...

測試完代碼後,我沒有看到關閉閱讀器和連接的問題。你能更好地描述這個問題嗎?

+0

ZipCodes文件有87,000 ++行。如果我選擇頂部N *,排序或過濾器不會查找所有行。如果我選擇*,Reader.Close()行最多暫停15秒。我的SQL連接是通過T1 VPN鏈接的,所以如果您要在SQL Server非常接近的地方進行測試,您可能會看到此問題。 –