2008-09-17 24 views
5

Ich kann eine elegante Möglichkeit nicht finden, den Rückgabewert aus einer gespeicherten Prozedur zu erhalten, wenn Sie TableAdapters verwenden.Wie Abrufen gespeicherter Prozedur Rückgabewerte von einem TableAdapter

Es scheint, dass der TableAdapter keine Rückgabewerte für gespeicherte SQL-Prozeduren unterstützt, wenn ein nicht skalarer Aufruf einer gespeicherten Prozedur verwendet wird. Sie würden erwarten, dass der Rückgabewert der automatisch generierten Funktion der Rückgabewert der gespeicherten Prozedur ist, aber nicht (es ist tatsächlich die Anzahl der betroffenen Zeilen). Obwohl es möglich ist, 'out'-Parameter zu verwenden und eine Variable als Referenz an die automatisch generierten Funktionen zu übergeben, ist dies keine sehr saubere Lösung.

Ich habe einige hässliche Hacks im Internet gesehen, um das zu lösen, aber keine anständige Lösung. Jede Hilfe wäre willkommen.

+0

In der Tat, ich habe das gleiche Problem, es ist lächerlich, dass die Rückgabewerte nicht unterstützt werden, ohne Hacking – nicodemus13

Antwort

0

Schließen Sie diese Frage, wie es scheint, Rückgabewerte werden nicht unterstützt und es gibt keine elegante Problemumgehung!

1

Die Methode zum Abrufen des Rückgabewerts besteht darin, einen SqlParameter für das SqlCommand-Objekt zu verwenden, dessen Richtung auf ParameterDirection.ReturnValue festgelegt ist. Sie sollten die SelectCommand-Eigenschaft des TableAdapter nach Aufrufen von Fill überprüfen.

+0

Die SelectCommand-Eigenschaft ist (AFAIK) private TableAdapter. Ich müsste daher jeden TableAdapter um eine Teilklasse erweitern, die meiner Meinung nach nicht die elegante Lösung ist, die ich zu finden hoffe. –

0

Ich kann nicht sicher sagen, weil ich TableAdapters nicht verwende, aber Sie müssen möglicherweise Ihre gespeicherte Prozedur betrachten und die folgenden um Ihre Prozedur einschließen.

SET ROWCOUNT OFF 

BEGIN 
<Procedure Content> 
END 

SET ROWCOUNT ON 
+0

Vielen Dank für den Vorschlag, aber das Einstellen der ROWCOUNT scheint mein Problem nicht zu lösen. –

1

HINWEIS: Der Weg zu gehen, ist eine SqlParameter mit, wo die Richtung = ParameterDirection.ReturnValue

das gesagt ist, wie jemand bereits SqlParameters erwähnt, hier ist ein dynamisches Verfahren alternative einen Datensatz mit. (Wenn das ist, wie Sie fahren):

Beispiel SQL-Anweisung und C# als Brachen:

string sql = @"DECLARE @ret int 
      EXEC @ret = SP_DoStuff 'parm1', 'parm2' 
      SELECT @ret as ret"; 

DataSet ds = GetDatasetFromSQL(sql); //your sql to dataset code here... 

int resultCode = -1; 
int.TryParse(ds.Tables[ds.Tables.Count-1].Rows[0][0].ToString(), out resultCode); 

Die gespeicherte Prozedur Ergebnisse werden in einen Datensatz geladen und werden so viele Datentabellen als Rück select-Anweisungen in der gespeicherten Prozedur haben .

Die letzte DataTable im DataSet hat 1 Zeile und 1 Spalte, die den Rückgabewert der gespeicherten Prozedur enthält.

1

Eigentlich alles, was Sie tun müssen, um Ihren endgültigen Wert aus der gespeicherten Prozedur zurückzukehren, um eine SELECT-Anweisung, nicht eine RETURN-Anweisung. Das Ergebnis von SELECT ist der Rückgabewert. Wenn Sie zum Beispiel Ihre sp exit-Anweisung "SELECT 1" eingeben, erhalten Sie eine 1 zurück. Wählen Sie nun einfach den tatsächlichen Skalar aus, den Sie zurückgeben möchten.

Verwandte Themen