Gewusst wie: Aufrufen eine parametrisierte gespeicherte Prozedur mit ADO.NET und Visual C# .NET

Eine Microsoft Visual Basic .NET Version dieses Artikels finden Sie unter 308049 .

Eine Microsoft Visual C++ .NET Version dieses Artikels finden Sie unter 310071 .

Eine Microsoft Visual j#-Version dieses Artikels finden Sie unter 320627 .


Dieser Artikel bezieht sich auf die folgenden Namespaces für Microsoft.NET Framework-Klassenbibliothek:

  • System.Data.SqlClient
  • System.Data.OleDb

IN DIESER AUFGABE

Zusammenfassung

Es gibt verschiedene Arten, mit ADO.NET eine gespeicherte Prozedur aufgerufen und wieder Rückgabewerte und-Parameter, einschließlich:

  • Verwenden Sie ein DataSet -Objekt, um die zurückgegebenen Zeilen zu sammeln und mit diesen Zeilen sowie den Rückgabewerten und-Parametern.
  • Ein DataReader -Objekt zurückgegebenen Zeilen verschieben durch diese Zeilen und sammeln Rückgabewerten und-Parametern zu verwenden.
  • Verwenden Sie die ExecuteScalar -Methode auf den Wert der ersten Spalte der ersten Zeile der Ergebnisse mit den Rückgabewerten und-Parametern zurückzugeben. Dies ist besonders sinnvoll bei Aggregatfunktionen.
  • Verwenden Sie die ExecuteNonQuery -Methode, um nur die Rückgabeparameter und Rückgabewerte zurückzugeben. Alle zurückgegebenen Zeilen werden verworfen. Dies ist besonders bei Aktionsabfragen.
Dieser Artikel beschreibt die letzten drei Methoden und SqlCommand und OleDbCommand -Objekte verwendet. Stellen Sie sicher, dass Sie nur den Code für den verwalteten Anbieter kopieren, die Sie verwenden. Wenn Sie nicht verwalteten Anbieter Sie verwenden sollten kennen, finden Sie auf der folgenden Microsoft Developer Network-Website:
In allen Beispielen in diesem Artikel werden die Parameter der Parameters -Auflistung des Command -Objekts hinzugefügt. Bei Verwendung des SqlCommand -Objekts Sie haben fügen Sie keine Parameter in einer bestimmten Reihenfolge, aber die Parameter müssen den korrekten Namen aufweisen. Wenn Sie OleDbCommand -Objekt verwenden, müssen Sie die Parameter in der korrekten Reihenfolge hinzufügen und können keine Parameter nach Namen.

Verwenden von DataReader zurückzugebenden Zeilen und Parametern

Das DataReader -Objekt können Sie einen schreibgeschützten Vorwärts Datenstrom zurückgeben. Der DataReader enthaltenen Informationen kommen aus einer gespeicherten Prozedur. Dieses Beispiel verwendet das DataReader -Objekt eine gespeicherte Prozedur ausführen, die einen Eingabe-und Ausgabeparameter und dann zurückgegebenen Datensätze durchsucht, um die Rückgabeparameter anzuzeigen.

  1. Erstellen Sie die folgende gespeicherte Prozedur auf dem Server mit Microsoft SQL Server:
    Create Procedure TestProcedure(
    @au_idIN varchar (11),
    @numTitlesOUT Integer OUTPUT
    )
    AS

    select A.au_fname, A.au_lname, T.title
    from authors as A join titleauthor as TA on
    A.au_id=TA.au_id
    join titles as T
    on T.title_id=TA.title_id
    where A.au_id=@au_idIN
    set @numTitlesOUT = @@Rowcount
    return (5)

  2. Erstellen Sie ein neues Visual C# .NET Windows-Anwendung-Projekt.
  3. Verwenden Sie die using -Anweisung auf System und im System.Data -Namespace, damit Sie keinen Deklarationen in diesen Namespaces in den Programmquelltext aufzunehmen. Fügen Sie diesen Code am Anfang des Codemoduls Form. Achten Sie darauf, nur den Code für den Provider kopieren, den Sie ausgewählt haben. SQL-Client
    using System.Data.SqlClient;
    OLE DB-Datenprovider
    using System.Data.OleDb;
  4. Ersetzen Sie den Code im privaten Form_Load -Ereignis mit dem folgenden Code:SQL Client
    SqlConnection PubsConn = new SqlConnection ("Data Source=server;integrated " + 
    "Security=sspi;initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand
    ("TestProcedure", PubsConn);

    testCMD.CommandType = CommandType.StoredProcedure;

    SqlParameter RetVal = testCMD.Parameters.Add
    ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add
    ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    SqlParameter NumTitles = testCMD.Parameters.Add
    ("@numtitlesout", SqlDbType.VarChar, 11);
    NumTitles.Direction = ParameterDirection.Output ;

    IdIn.Value = "213-46-8915";
    PubsConn.Open();

    SqlDataReader myReader = testCMD.ExecuteReader();
    Console.WriteLine ("Book Titles for this Author:");
    while (myReader.Read())
    {
    Console.WriteLine ("{0}", myReader.GetString (2));
    };
    myReader.Close() ;
    Console.WriteLine("Number of Rows: " + NumTitles.Value );
    Console.WriteLine("Return Value: " + RetVal.Value);

    OLE DB-Datenprovider
    OleDbConnection PubsConn = new OleDbConnection    ("Provider=SQLOLEDB;Data Source=server;" + 
    "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand
    ("TestProcedure", PubsConn);

    testCMD.CommandType = CommandType.StoredProcedure;

    OleDbParameter RetVal = testCMD.Parameters.Add
    ("RetVal", OleDbType.Integer);RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add
    ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    OleDbParameter NumTitles = testCMD.Parameters.Add
    ("@numtitlesout", OleDbType.VarChar, 11);
    NumTitles.Direction = ParameterDirection.Output;

    IdIn.Value = "213-46-8915";

    PubsConn.Open();

    OleDbDataReader myReader = testCMD.ExecuteReader();
    Console.WriteLine ("Book Titles for this Author:");
    while (myReader.Read())
    {
    Console.WriteLine ("{0}", myReader.GetString (2));
    };
    myReader.Close() ;
    Console.WriteLine("Number of Rows: " + NumTitles.Value );
    Console.WriteLine("Return Value: " + RetVal.Value);

  5. Ändern Sie die Verbindungszeichenfolge für das Connection -Objekt auf dem Computer, auf dem SQL Server ausgeführt wird.
  6. Führen Sie den Code aus. Beachten Sie, dass der DataReader die Datensätze abruft und die Parameterwerte zurückgibt. Die Read -Methode des DataReader -Objekts können Sie durch die Datensätze navigieren.

    Das Ausgabefenster zeigt die Titel von zwei Büchern, den Rückgabewert 5 und den Ausgabeparameter, der die Anzahl der Datensätze (2) enthält. Beachten Sie, dass Sie DataReader im Code um die Parameterwerte sehen müssen. Beachten Sie außerdem, dass nicht alle Datensätze auf der Rückgabeparameter DataReader geschlossen durchlaufen.

Verwenden der ExecuteScalar-Methode des Befehlsobjekts

Die ExecuteScalar -Methode des Command -Objekts können Sie Parameterwerte abrufen. ExecuteScalar gibt außerdem die erste Spalte der ersten Zeile der gespeicherten Prozedur. Dies ist besonders bei Aggregatfunktionen wie im folgenden Beispiel.

  1. Erstellen Sie die folgende gespeicherte Prozedur auf dem Server mit SQL Server:
    Create Procedure TestProcedure2(
    @au_idIN varchar (11)
    )
    As
    /* set nocount on */
    select count (T.title)
    from authors as A join titleauthor as TA on
    A.au_id=TA.au_id
    join titles as T
    on T.title_id=TA.title_id
    where A.au_id=@au_idIN
    Return(5)

  2. Erstellen Sie ein neues Visual C# .NET Windows-Anwendung-Projekt.
  3. Verwenden Sie die using -Anweisung auf System und im System.Data -Namespace, damit Sie keinen Deklarationen in diesen Namespaces in den Programmquelltext aufzunehmen. Fügen Sie diesen Code am Anfang des Codemoduls Form. Stellen Sie sicher, dass Sie nur den Code für den Provider kopieren, den Sie ausgewählt haben. SQL-Client
    using System.Data.SqlClient;
    OLE DB-Datenprovider
    using System.Data.OleDb;
  4. Fügen Sie folgenden Code zum Ereignis Form_Load :SQL Client
    string strCount;SqlConnection PubsConn = new SqlConnection 
    ("Data Source=server;integrated " +
    "Security=sspi;initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand
    ("TestProcedure2", PubsConn);

    testCMD.CommandType = CommandType.StoredProcedure;

    SqlParameter RetVal = testCMD.Parameters.Add
    ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add
    ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;

    IdIn.Value = "213-46-8915";

    PubsConn.Open();

    strCount =testCMD.ExecuteScalar ().ToString() ;

    Console.WriteLine("Number of Rows: " + strCount );
    Console.WriteLine("Return Value: " + RetVal.Value);

    OLE DB-Datenprovider
    string strCount;OleDbConnection PubsConn = new OleDbConnection 
    ("Provider=SQLOLEDB;Data Source=server;" +
    "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand
    ("TestProcedure2", PubsConn);

    testCMD.CommandType = CommandType.StoredProcedure;

    OleDbParameter RetVal = testCMD.Parameters.Add
    ("RetVal", OleDbType.Integer);
    RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add
    ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;

    IdIn.Value = "213-46-8915";

    PubsConn.Open();

    strCount = testCMD.ExecuteScalar().ToString() ;

    Console.WriteLine("Number of Rows: " + strCount);
    Console.WriteLine("Return Value: " + RetVal.Value);

  5. Ändern Sie die Verbindungszeichenfolge für das Connection -Objekt auf dem Computer, auf dem SQL Server ausgeführt wird.
  6. Führen Sie den Code aus. Beachten Sie, dass die ExecuteScalar -Methode des Befehlsobjekts die Parameter zurückgibt. ExecuteScalar gibt auch den Wert von Spalte 1, Zeile 1 des zurückgegebenen Rowsets zurück. Daher ist der Wert von IntCount das Ergebnis der Zählfunktion von der gespeicherten Prozedur.

Verwenden der ExecuteNonQuery-Methode des Befehlsobjekts

Dieses Beispiel verwendet die ExecuteNonQuery -Methode zum Ausführen der Abfrage und die Parameterwerte zurückzugeben. ExecuteNonQuery gibt außerdem die Anzahl der Datensätze, die nach der Ausführung der Abfrage betroffen sind. Allerdings ist ExecuteNonQuery keine Zeilen oder Spalten von der gespeicherten Prozedur zurück.

Die ExecuteNonQuery -Methode eignet sich am besten, wenn INSERT, UPDATE oder DELETE-Anweisung verwenden, wenn Sie nur wissen, wie viele Zeilen geändert wurden. In einer gespeicherten Prozedur, in der Sie nur eine SELECT-Anweisung verwenden, erhalten Sie-1, weil keine Zeilen von der Abfrage betroffen sind.

  1. Erstellen Sie die folgende gespeicherte Prozedur auf dem Computer mit SQL Server:
    Create Procedure TestProcedure3(
    @au_idIN varchar (11),
    @au_fnam varchar (30)
    )

    As
    /* set nocount on */
    Update authors set au_fname = @au_fnam
    where au_id = @au_idin
    return (5)

  2. Erstellen Sie ein neues Visual C# .NET Windows-Anwendung-Projekt.
  3. Verwenden Sie die using -Anweisung auf System und im System.Data -Namespace, damit Sie keinen Deklarationen in diesen Namespaces in den Programmquelltext aufzunehmen. Fügen Sie diesen Code am Anfang des Codemoduls Form. Stellen Sie sicher, dass Sie nur den Code für den Provider kopieren, den Sie ausgewählt haben. SQL-Client
    using System.Data.SqlClient;
    OLE DB-Datenprovider
    using System.Data.OleDb;
  4. Ersetzen Sie den Code unter dem privaten Form1_Load -Ereignis im Form1-Codemodul durch den folgenden Code:SQL Client
    string strRowAffect;SqlConnection PubsConn = new SqlConnection 
    ("Data Source=server;integrated Security=sspi;" +
    "initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand
    ("TestProcedure3", PubsConn);

    testCMD.CommandType = CommandType.StoredProcedure;

    SqlParameter RetVal = testCMD.Parameters.Add
    ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add
    ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    SqlParameter FnameIn = testCMD.Parameters.Add
    ("@au_fnam", SqlDbType.VarChar, 30);
    FnameIn.Direction = ParameterDirection.Input;

    IdIn.Value = "213-46-8915";
    FnameIn.Value = "Marjorie";

    PubsConn.Open();

    strRowAffect =testCMD.ExecuteNonQuery ().ToString() ;

    Console.WriteLine("Number of Rows: " + strRowAffect );
    Console.WriteLine("Return Value: " + RetVal.Value);

    OLE DB-Datenprovider
    int intRowAffected;OleDbConnection PubsConn = new OleDbConnection 
    ("Provider=SQLOLEDB;Data Source=server;" +
    "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand
    ("TestProcedure3", PubsConn);

    testCMD.CommandType = CommandType.StoredProcedure;

    OleDbParameter RetVal = testCMD.Parameters.Add
    ("RetVal", OleDbType.Integer);
    RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add
    ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    OleDbParameter FnameIn = testCMD.Parameters.Add
    ("@au_fname", OleDbType.VarChar, 30);
    FnameIn.Direction = ParameterDirection.Input;

    IdIn.Value = "213-46-8915";
    FnameIn.Value = "Marjorie";

    PubsConn.Open();
    intRowAffected = testCMD.ExecuteNonQuery();

    Console.WriteLine("Number of Rows affected: " + intRowAffected);
    Console.WriteLine(RetVal.Value);

  5. Ändern Sie die Verbindungszeichenfolge für das Connection -Objekt auf dem Computer, auf dem SQL Server ausgeführt wird.
  6. Führen Sie den Code aus. Das Ausgabefenster zeigt die Anzahl der betroffenen Zeilen (IntRowAffect) und der Wert des Rückgabeparameters.

Referenzen

Weitere Informationen finden Sie auf der folgenden MSDN-Websites:

Eigenschaften

Artikelnummer: 310070 – Letzte Überarbeitung: 20.01.2017 – Revision: 1

Microsoft ADO.NET 1.1, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition

Feedback