2010-11-18 8 views
0

Ich verwende eine gespeicherte Prozedur, die 6 SELECT-Abfragen enthält, und ich führe diese gespeicherte Prozedur aus C# aus. Ich bekomme die Tabellen im Datensatz von nur den ersten 3 Abfragen. h. die Daten werden von den ersten 3 Abfragen, die ich verwendet habe, abgerufen. Das Dataset enthält nur 3 Tabellen.Wie viele Tabellen ein Dataset mit gespeicherter Prozedur zurückgeben kann

vermag ich nicht zu verstehen, was falsch ist, oder ob die gespeicherte Prozedur von C# ausführen kann maximal nur drei Tabellen

UPDATE abrufen:

Create Procedure myTest 
    @paraID as bigint 
AS 

Hier habe ich geschrieben 6 SELECT-Abfragen mit dem Parameter @paraid in where Klausel

in C#:

SqlConnection con = new SQLConnection(); 
SqlCommand cmd = new SQLCommand(); 
SqlDAtaadpter adpt = new SqlDataadapter(); 

DataSet ds = new DataSet(); 

con.ConnectionString = "MyConnectionString"; 

con.Open(); 
cmd.CommandType= CommandType.StoredProcedure; 
cmd.CommandText ="mytest"; 
cmd.Parameters.Add("@paraID", SqlDbType.Bigint).value = 1; 

cmd.Connection = con; 

adpt.SelectCommant = cmd; 
adpt.Fill(ds); 

con.Close(); 

Das ist mein C# -Code. Nun sagen Sie mir, was

getan
+0

Wie * genau * führen Sie den SP aus und füllen das 'DataSet'? –

+0

Ich mache das mit SQLDataAdapter. Ich habe eine Datenzugriffsklasse mit vollständiger Konnektivität und Funktion zum Abrufen von Daten von SP –

+0

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? –

Antwort

4

VoN DbDataAdapter.Fill Method (DataSet)

werden muss, wenn ein Befehl keine Zeilen zurückgeben, keine Tabellen zu dem DataSet hinzugefügt werden, und keine Ausnahme.

Wenn die SELECT-Anweisung verwendet, um das Daten-Set kehrt mehrere Ergebnisse bevölkern, wie Batch-SQL-Anweisungen, wenn eines der Ergebnisse enthält einen Fehler, werden alle nachfolgenden Ergebnisse sind übersprungen und sind nicht auf die DataSet hinzugefügt .

Wenn die Abfrage spezifiziert kehrt mehrere Ergebnisse, die Ergebnismenge für jede Reihe zurückkehr Abfrage in eine separate Tabelle platziert wird. Zusätzliches Ergebnis Sätze werden benannt, indem Integralwerte an den angegebenen Tabellennamen angehängt werden (z. B. "Tabelle", "Tabelle1", "Tabelle2" usw.). Da keine Tabelle für eine Abfrage erstellt wird, die nicht return Reihen der Fall ist, wenn Sie einen Einsatz Abfrage von einer Auswahlabfrage gefolgt verarbeiten, die Tabelle für die Auswahlabfrage erstellt ist namens „Table“, weil es die erste Tisch erstellt. Anwendungen mit Spalten- und Tabellennamen sollten sicherstellen, , dass Konflikte mit diesen Namen Muster nicht auftreten.

Sind Sie sicher, dass es keine Fehler gibt und dass alle 6 SELECT-Anweisungen Daten zurückgeben?

+0

ya ich bin mir sicher, dass ich das perfekte Ergebnis bekomme, wenn ich den gleichen SP in SQL Management Studio ausführe. –

+0

@ Sumit: Validierung der Ausführung des SPROC in SSMS ist ein guter. An dieser Stelle würde ich SQLProfile anschließen (mithilfe der TSQL_SPs Vorlage, um die Ausführung Ihres Sproc, wie er von der CLR aufgerufen wird, zu erfassen. Das wird Ihnen definitiv sagen, dass die Ausführung Ihres Skripts aus Code definitiv 6 Datensätze zurückgibt oder nicht Stellen Sie sicher, dass Sie SSMS mit demselben authentifizierten Benutzer testen, den Ihr Code verwendet. –

0

Es gibt keine Datentabellenbeschränkung für Dataset. In Ihrem Fall können Sie Datentabelle aus SP speichern und zurückgeben. Ich denke, es muss ein Problem in Ihrer SP-Ausführung sein. Wenn Sie sicher sind, dass es keinen Fehler auf sp und keine Ausnahme gibt, dann können Sie zum Testen microsoft dll verwenden, die Ihnen sagen, was genau vor sich geht.

Microsoft bieten eine gute dll (Data Access Application Block) für den Zugriff auf die Datenbank, so dass Sie es versuchen können. In dieser DLL gibt es einige Funktionen in der SqlHelper Klasse wie ExecuteDataSet, ExecuteNonQuery etc ..

Also in Ihrem Fall können Sie verwenden

Objekt [] objParams = {par1, par2}; DataSet ds = SqlHelper.ExecuteDataset (Verbindungszeichenfolge, "SP_Name", objParams);

und sp_name sollte so sein ..

crerate Verfahren sp_name varchar @ par1 als

// Select * from tab1 // select * from tab2 // select * from tab3 wählen // * von TAB4 Ende

so auf SqlHelper der ExecuteDataset, werden Sie 4 Tisch bekommen ... so versuchen ApplicationDataBlock.dll

0

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.

Verwandte Themen