2009-06-25 11 views
5

Wenn ich in der gespeicherten Prozedur nur eine Anweisung ausführen, select count(*) from sometable, dann von Clientseite (ich verwende C# ADO.Net SqlCommand, um die gespeicherte Prozedur aufzurufen), Wie kann ich den Wert count(*) abrufen? Ich verwende SQL Server 2008.Wie skalaren Wert von gespeicherten Prozedur (ADO.NET) abrufen

Ich bin verwirrt, weil count(*) nicht als Rückgabewert Parameter der gespeicherten Prozedur verwendet wird.

Vielen Dank im Voraus, George

Antwort

6

Entweder Sie verwenden ExecuteScalar als Andrew vorgeschlagen - oder Sie Ihren Code ein wenig ändern müssen:

CREATE PROCEDURE dbo.CountRowsInTable(@RowCount INT OUTPUT) 
AS BEGIN 
    SELECT 
    @RowCount = COUNT(*) 
    FROM 
    SomeTable 
END 

und dann diese ADO.NET Anruf, um den Wert abzurufen:

using(SqlCommand cmdGetCount = new SqlCommand("dbo.CountRowsInTable", sqlConnection)) 
{ 
    cmdGetCount.CommandType = CommandType.StoredProcedure; 

    cmdGetCount.Parameters.Add("@RowCount", SqlDbType.Int).Direction = ParameterDirection.Output; 

    sqlConnection.Open(); 

    cmdGetCount.ExecuteNonQuery(); 

    int rowCount = Convert.ToInt32(cmdGetCount.Parameters["@RowCount"].Value); 

    sqlConnection.Close(); 
} 

Marc

PS: aber in diesem konkreten Beispiel, ich denke, die Alternative mit nur Ausführen ExecuteScalar ist einfacher und einfacher zu verstehen. Diese Methode funktioniert möglicherweise OK, wenn Sie mehr als einen einzelnen Wert (z. B. aus mehreren Tabellen oder dergleichen) zurückgeben müssen.

+0

Dank @Marc, ich habe Ihre Lösung getestet funktioniert! Cool! – George2

6

Wenn Sie die Abfrage Aufruf ausführen ExecuteScalar - das wird das Ergebnis zurück.

Führt die Abfrage aus und gibt die erste Spalte der ersten Zeile in der von der Abfrage zurückgegebenen Ergebnismenge zurück. Zusätzliche Spalten oder Zeilen werden ignoriert.

Da Sie nur einen Wert zurückgeben, würde dies nur den Wert aus Ihrem Ausdruck count zurückgeben. Sie müssen das Ergebnis dieser Methode in eine int umwandeln.

+1

In diesem Fall müssen Sie tun: SELECT YOURVALUE - und nicht zurück YOURVALUE – Zanoni

+0

"Sie tun müssen: SELECT YOURVALUE - und nicht YOURVALUE Return" - verwirrt, was meinst du? Könnten Sie bitte mehr erklären? – George2

+0

@Andrew, mag ich Ihre Antwort, aber nach dem Lesen von Marc Antwort, denke ich, die elegantere Art und Weise sollte Rückgabewert der Speicherprozedur, irgendwelche Kommentare verwenden? – George2

1

marc_s Antwort funktionierte gut für Integer. aber für varchar muss die Länge angegeben werden.

cmdGetCount.Parameters.Add("@RowCount", SqlDbType.varchar,30).Direction = ParameterDirection.Output; 
Verwandte Themen