2009-04-02 4 views
0

Ich führe eine Reihe von SQL-Abfragen als Batch und dann alle Ergebnismengen zurück in einem Batch. Die Art und Weise, wie mein Code derzeit zusammengestellt wird, wird übersprungen. Nun, da ich das weiß, könnte ich einfach eine andere Aussage außerhalb meiner Schleife einwerfen, die das erste Ergebnis erfasst, aber ich frage mich, ob es eine elegantere Lösung für dieses Problem gibt.Wie man am besten über einen Batch von Ergebnissen mit einem C# DbDataReader Schleife

Hier einige sudo-Code, was los ist:

DbDataReader reader= /*some stuff that returns a batch of results...*/; 

while (reader.NextResult()) 
{ 
    while (reader.Read()) 
    { 
     if (!reader.IsDBNull(0)) 
     { 
      //do things with the data.... 
     } 
    } 
} 

Jetzt hätte ich erwartet, dass Nextresult(), die Sie das erste Ergebnis geht das erste Mal, wenn Sie es nennen, das ist, was Read() scheint machen. Was es jedoch tatsächlich zu tun scheint, bringt Sie beim ersten Anruf zum zweiten Ergebnis. Bin ich Missverständnis, wie Sie diese Methode verwenden, sind zu erwarten, oder sind Sie wirklich einige, wie das zu erwarten haben folgende Möglichkeiten:

DbDataReader reader= /*some stuff that returns a batch of results...*/; 

//this deals with the row in the the very first result 
while (reader.Read()) 
{ 
    if (!reader.IsDBNull(0)) 
    { 
     //do things with the data.... 
    } 
} 

//this deals with the rest of the rows... 
while (reader.NextResult()) 
{ 
    while (reader.Read()) 
    { 
     if (!reader.IsDBNull(0)) 
     { 
      //do exact same things with the data.... 
      //is this not pretty klugey? 
     } 
    } 
} 

Diese mich als faul Programmierstil trifft, aber ich sehe keinen Weg darum herum . Kennt jemand eine elegantere Lösung dafür?

Antwort

9

Einfach das Nextresult am Ende der Schleife statt am Anfang:

do { 
    while (reader.Read()) { 
     if (!reader.IsDBNull(0)) { 
     //do things with the data.... 
     } 
    } 
} while (reader.NextResult()); 
+0

Beat mich um 4 Sekunden! –

+0

ich fühle mich albern - danke, ich weiß nicht, warum ich nie daran gedacht habe ... –

+0

Ich frage mich immer noch, ob sweeney nicht tiefer gehen sollte, wenn man darüber nachdenkt. Ich kann mir nicht viele Situationen vorstellen, in denen ich mehrere Datensätze abrufen und genau dasselbe mit ihnen machen würde. –

3

In den allermeisten Fällen geben Sie nur einen einzigen Ergebnissatz mit einem bestimmten Aufruf zurück, so dass es für die Designer nicht sinnvoll wäre, jedes Mal, wenn Sie ein Lesegerät verwenden, ein "NextResultSet" zu benötigen.

So hält Ihr zweites Beispiel tatsächlich wenn Sie mehrere Ergebnissätze ziehen. Die andere Sache, die Ihr Post mich wundern lässt, ist, warum Sie die "genau gleichen Dinge mit den Daten" tun würden, wenn Sie mehrere Ergebnismengen abrufen - würde die Struktur der Daten nicht so unterschiedlich sein, dass Sie würde nicht genau die gleichen Dinge tun?

Das heißt, Ihr Beispiel lässt mich fragen, ob Sie keine Art von Fehler in Ihrem Denken darüber haben, wie die Datenverwaltungsfunktionen funktionieren.

+0

hilft nicht unbedingt: Ich habe ein generische Prozedur, die eine Verbindung zu unserer Datenbank herstellt, einige Abfragen aus einer Datei ausführt und weiß, wie die Ergebnisse unabhängig vom Format für die Ergebnisse in einer anderen Datei ausgegeben werden. –

+0

Gute Erklärung dafür, warum sie anders funktionieren: upvote. –

+0

Punkt genommen, markieren, aber in meinem Fall gibt es genug Metadaten in den Ergebnissen, die ich ziehe, dass ich entscheiden kann, was ich mit ihnen im Flug tun. das ist mehr oder weniger der Inhalt der innersten Schleife, die ich weggelassen habe. –

0

ich tun dies in der Regel:

if(reader.HasRows) 
    { 
     while(reader.Read()) 
     { 

      // Do Stuff 
     } 
    } 

Hoffe, dass es

+0

Sie missverstehen das Problem, denke ich. Die Frage war nicht, ob der Leser Zeilen hatte oder nicht, sondern ob er zahlreiche Ergebnismengen hatte, die man mit NextResult() testen kann. Dann testen Sie jede Ergebnismenge für zahlreiche Zeilen mit Read(). –

Verwandte Themen