2009-07-02 10 views
0

私は、2000万を超えるレコードを持つデータベースをクエリしているプロジェクトの途中で、いくつかのフィルタセットを適用して約200レコードを返します1.30分)。私はそれがDataReaderの問題だと思うので、データベースを照会した後、この特定のデータウェアハウスからオブジェクトを作成しようとしますが、15または16レコードごとにasp.netプロセスがハングします(デバッガでハングします)。レコードをオブジェクトにマッピングするときにDataReaderがハングする

これは私を夢中にしています。

ここで私は、 "DataReaderの問題" を

using (IDataReader reader = cmd.ExecuteReader()) 
       { 
List<Project> projects = new List<Project>(); 
        while(reader.Read()) projects.Add(GetMappedRecord(reader)); 
       } 

private Project GetMappedRecord(DataRow reader) 
     { 
      Project project = new Project(); 

      project.PropertyA = reader["FieldA"] as string; 

// and so on and so forth... 
      return project; 
     } 
+1

15件ごとに16件...ハングアップします。最初の15の後にのみハングアップすることができます。または、15ごとに遅延させることができます。最後のオプションでは、パッケージに15,16レコードが収まるように臭いがあり、クエリは1:30後に_first_レコードのみを配信します。いくつかのクエリは遅れて実行される可能性があります。 –

答えて

0

を使用しているコードですか?

に、DataReaderが動作していると思われるように動作するコードを記述したい場合は、それを実行できますか?時には、「私がバグだったら、どこに隠れてしまうのか」、あるいは「どこに隠れることができないのだろうか」と考えるのは良いことです。

チャンスはそれ以上です。

実験1:それがハングした場合

using (IDataReader reader = cmd.ExecuteReader()) 
{ 
    while(reader.Read()) 
     ; 
} 

を参照してください。がハングするときはを参照してください(どのフィルタのセット)。

ハング(およびフィルタのセット)が取得されたら、Management Studioで同じパラメータを使用して同じSQLを試してみてください。その組み合わせが長時間かかるかどうかを確認してください(SQL Server 2008を使用している場合は、アクティビティモニターを参照してクエリが「低速」リストにあるかどうかを確認してください)。


実験1は成功しますが、それはインデクサーの問題だ、のは、次のことを試してみましょうので:(!とどのくらいのために)

try { 
    using (IDataReader reader = cmd.ExecuteReader()) 
    { 
     while(reader.Read()) { 
      for (int i=0; i<reader.FieldCount; i++) { 
       object v = reader.GetValue(i); 
      } 
     } 
    } 
} catch (Exception ex) { 
    Console.WriteLine(ex.ToString()); // Or MessageBox.Show or whatever 
} 

それがハングアップした場合を見てみましょう

+0

クエリには約1.30分かかります。この問題は、15個のオブジェクトごとにリーダー["プロパティ"]を作成するときに発生します。 – Paleta

+0

これはあなたがリーダー["property"]だけになるように問題を分離したことを意味し、上記のようなサンプルコードは常に完璧に実行されますか? – nos

+0

はい、私はステップバイステップでデバッグしました。そして15個のオブジェクトの後に、私はちょうど10秒間ハングアップします。 – Paleta

0

多分それはキャスティングと関係がありますか?

while(reader.Read()) 
{ 
    var Project = new Project(); 
    Project.StringProperty = reader.IsDBNull(reader.GetOrdinal("FieldA")) 
          ? "" 
          : reader.GetString(reader.GetOrdinal("FieldA")); 
    //etc.... 
} 

それはのDataRowへの暗黙的なキャストと、再び読者からのキャストが可能です「のように」との文字列に[「FIELDA」]遅くなることができます:私はのDataReadersを使用して慣れている方法は、このようなより多くでありますそれはダウン。

関連する問題