2009-07-02 6 views
0

Ich bin mitten in einem Projekt, wo wir eine Datenbank mit mehr als 20 Millionen Datensätze abfragen, mehrere Filter anwenden unsere Abfrage gibt ca. 200 Datensätze zurück (nach etwa warten auf 1.30 Minuten). Nach dem Abfragen der Datenbank versuche ich, Objekte von diesem bestimmten Datenreader zu erstellen, aber alle 15 oder 16 Datensätze hängen der asp.net-Prozess (hängt im Debugger), also denke ich, dass es ein DataReader-Problem ist.DataReader hängt während der Zuordnung eines Datensatzes zu einem Objekt

Das macht mich verrückt.

Hier ist der Code, den ich

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

Alle 15 | 16 Datensätze ... es hängt. Es kann nur nach den ersten 15 hängen bleiben, oder alle 15 verzögert werden. Diese letzte Option riecht, als ob 15 | 16 Datensätze in einem Paket passen, und Ihre Abfrage liefert erst die _first_ Datensätze nach 1:30. Einige Abfragen können (und werden) träge ausgeführt werden. –

Antwort

0

"Ein Datareader Problem" mit?

Wenn Sie wollten ein Stück Code schreiben, die sich so verhalten, wie Sie glauben, dass DataReader verhält, könnten Sie das tun? Manchmal ist es gut zu denken: "Wenn ich ein Käfer wäre, wo würde ich mich verstecken" oder "Wo könnte ich mich nicht verstecken?"

Chancen sind da mehr dran. 1

Experiment:

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

Sehen, ob das hängt. Siehe wenn es hängt (welcher Satz von Filtern).

Wenn Sie einen Hang (und eine Reihe von Filtern) bekommen, probieren Sie dieselbe SQL (mit denselben Parametern) in Management Studio aus. Prüfen Sie, ob diese Kombination lange dauert (wenn Sie SQL Server 2008 verwenden, suchen Sie im Aktivitätsmonitor nach, ob sich Ihre Abfrage in der Liste "langsam" befindet).


Seit Experiment 1 erfolgreich ist, aber es ist ein Problem mit dem Indexer, wollen wir versuchen, die folgenden:

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 
} 

Mal sehen, ob das hängt (und wie lange!)

+0

Die Abfrage dauert etwa 1,30 Minuten. Das Problem entsteht, wenn ich Reader ["Eigenschaft"] alle 15 Objekte vorstelle. – Paleta

+0

Bedeutet das, dass Sie das Problem isoliert haben, um nur Leser ["Eigenschaft"] zu sein, und dass Beispielcode wie oben immer fehlerlos läuft? – nos

+0

Ja, ich debuggte Schritt für Schritt und nach 15 Objekten legte ich einfach für 10 Sekunden oder so auf. – Paleta

0

es Vielleicht Hat etwas mit dem Casting zu tun? Die Art, wie ich gewohnt bin zu Datareader verwendet, ist mehr wie folgt aus:

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

Es ist möglich, die implizite Umwandlung in die DataRow und dann wieder die Besetzung von Leser [ „FieldA“] zu String mit dem „wie“ könnte verlangsamen es runter.

Verwandte Themen