2011-10-21 14 views
1

SQLDataReaderを使用してテーブルから制限された行数を読み込み、グリッドビューにページングできるようにしています。私が望む行数を読んだら、私は終了したい。ただし、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が非常に近い場所でこれをテストすると、この問題が発生する可能性があります。 –

関連する問題