Ich weiß, dass diese Frage alt ist, aber als ich auf das gleiche Problem stieß, war es die einzige Frage, die ich beim googlen fand, die das Problem beschrieb. Die angenommenen Antworten haben nicht geholfen, also teile ich meine Lösung.
Um das Problem zu wiederholen. Wenn Sie mit dem DataAdapter Tabellen aus einer gespeicherten Prozedur füllen, die mehrere Ergebnismengen zurückgibt, erhalten Sie weniger Tabellen als erwartet. In meinem Fall war es 4 von 8. Wenn Sie die gespeicherte Prozedur direkt in Management Studio aufrufen, wird die korrekte Nummer zurückgegeben. Das ursprüngliche OP sagte nichts über die Umwelt. Ich habe das Problem mit Mono in einer Linux-Distribution erlebt, um über das Netzwerk auf SQL Server zuzugreifen. Bei der lokalen Ausführung der gleichen C# -Binärdatei auf dem Rechner, auf dem SQL Server ausgeführt wird, gab es kein Problem. Wenn ich nachprüfte, hatte jede einzelne gespeicherte Prozedur, die mehrere Resultsets zurückgab, das gleiche Problem, wenn sie von Linux aufgerufen wurde.
Um gründlich zu sein, habe ich SQL Profiler eingerichtet, um den SP-Anruf abzufangen. Obwohl Sie die tatsächlichen Ergebnisse nicht anzeigen können, hat es bestätigt, dass die richtige Anzahl der Zeilen abgerufen wurde. Ich musste daher feststellen, dass es irgendwo in der Mono-Implementierung einen Fehler gibt, der dazu führt, dass der DataAdapter nicht alle Tabellen ausfüllt. Glücklicherweise gibt es eine gute Möglichkeit, das Problem zu umgehen, indem Sie keinen DataAdapter verwenden, sondern einen DataReader verwenden. Ich hatte bereits eine Hilfsfunktion, die eine Datatable aus einer Datareader zurückgibt (nicht schwer, sich selbst zu schreiben, aber wenn jemand Hilfe braucht, lass es mich wissen), so konnte ich so kodieren:
SqlDataReader rdr = cmd.ExecuteReader();
List<DataTable> tables = new List<DataTable>();
while (rdr.HasRows)
{
DataTable t = GetTableFromReader(rdr);
tables.Add(t);
rdr.NextResult();
}
Dann Alles, was ich tun musste, war, die Tabellen zu einem DataSet hinzuzufügen, und ich hatte genau erreicht, was die Fill-Methode des DataAdapter getan hatte. Diese Technik funktioniert sowohl für die native Windows- als auch für die Mono-Implementierung von .Net. Übrigens ist meiner Meinung nach der zitierte Auszug aus der Dokumentation tatsächlich falsch. Wenn ein Teil der mehreren Ergebnismengen keine Zeilen enthält, fügt die Fill-Methode des DataAdapter die Tabelle nicht zum DataSet hinzu. Das ist nicht richtig. Tatsächlich erhalten Sie eine Tabelle mit korrekt gesetzten Spalten ohne Zeilen. Dies ist besonders wichtig (und sehr nützlich), wenn Sie an das DataSet gebunden sind. Meine obige Problemumgehung tut dies jedoch nicht. Es verhält sich wie die Dokumentation sagt, dass der DataAdapter sollte! Wenn Sie also an das resultierende DataSet binden, müssen Sie eigene leere Tabellen hinzufügen, um die fehlenden zu ersetzen. Die Tatsache, dass meine Problemumgehung funktioniert und die korrekte Anzahl von Tabellen abruft, ist ein weiterer Beweis dafür, dass das aufgetretene Problem ein Fehler in der Mono-Implementierung ist.
Wie * genau * führen Sie den SP aus und füllen das 'DataSet'? –
Ich mache das mit SQLDataAdapter. Ich habe eine Datenzugriffsklasse mit vollständiger Konnektivität und Funktion zum Abrufen von Daten von SP –
Sie sind sicher, dass alle 6 Abfragen ausgeführt werden?Gibt es irgendwelche if-Anweisungen um die 6, weil NULL im Vergleich zu '' die Ausführungsreihenfolge in SQL beschädigen kann? –