Verwendung gespeicherter Prozedurausgabeparameter in C#
Frage
Die Rückgabe von Ausgabeparametern aus einer gespeicherten SQL Server-Prozedur in eine C#-Variable kann eine Herausforderung sein. Obwohl sie verschiedene Empfehlungen befolgen, melden viele Entwickler immer noch Nullwerte oder andere Probleme.
Gespeicherte Prozedur
Betrachten Sie die folgende gespeicherte Prozedur usp_InsertContract
, die dazu dient, eine Vertragsnummer in die Datenbank einzufügen und den Primärschlüssel als Ausgabeparameter zurückzugeben:
<code class="language-sql">CREATE PROCEDURE usp_InsertContract @ContractNumber varchar(7), @NewId int OUTPUT AS BEGIN INSERT INTO [dbo].[Contracts] (ContractNumber) VALUES (@ContractNumber); Select @NewId = Id From [dbo].[Contracts] where ContractNumber = @ContractNumber; END</code>
Datenbank öffnen
Öffnen Sie die Datenbankverbindung mit dem folgenden Code:
<code class="language-csharp">pvConnectionString = "Server = Desktop-PC\SQLEXPRESS; Database = PVDatabase; User ID = sa; PASSWORD = *******; Trusted_Connection = True;"; try { pvConnection = new SqlConnection(pvConnectionString); pvConnection.Open(); } catch (Exception e) { databaseError = true; }</code>
Befehl ausführen
Führen Sie die gespeicherte Prozedur mit dem folgenden Code aus:
<code class="language-csharp">pvCommand = new SqlCommand("usp_InsertContract", pvConnection); pvCommand.Transaction = pvTransaction; pvCommand.CommandType = CommandType.StoredProcedure; pvCommand.Parameters.Clear(); pvCommand.Parameters.Add(new SqlParameter("@ContractNumber", contractNumber)); SqlParameter pvNewId = new SqlParameter(); pvNewId.ParameterName = "@NewId"; pvNewId.DbType = DbType.Int32; pvNewId.Direction = ParameterDirection.Output; pvCommand.Parameters.Add(pvNewId); try { sqlRows = pvCommand.ExecuteNonQuery(); if (sqlRows > 0) Debug.Print("New Id Inserted = ", pvCommand.Parameters["@NewId"].Value.ToString()); } catch (Exception e) { Debug.Print("Insert Exception Type: {0}", e.GetType()); Debug.Print(" Message: {0}", e.Message); }</code>
Lösung
Verwenden Sie SCOPE_IDENTITY()
, um den Primärschlüssel abzurufen und einige Änderungen an der gespeicherten Prozedur vorzunehmen, um das Nullwertproblem zu lösen:
<code class="language-sql">CREATE PROCEDURE usp_InsertContract @ContractNumber varchar(7), @NewId int OUTPUT AS BEGIN INSERT INTO [dbo].[Contracts] (ContractNumber) VALUES (@ContractNumber); SELECT @NewId = SCOPE_IDENTITY(); END</code>
Um diese geänderte gespeicherte Prozedur in C# zu verwenden, implementieren Sie den folgenden Code:
<code class="language-csharp">using(SqlConnection conn = new SqlConnection(pvConnectionString)) using(SqlCommand cmd = new SqlCommand("dbo.usp_InsertContract", conn)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@ContractNumber", SqlDbType.VarChar, 7).Value = contractNumber; cmd.Parameters.Add("@NewId", SqlDbType.Int).Direction = ParameterDirection.Output; conn.Open(); cmd.ExecuteNonQuery(); int contractID = Convert.ToInt32(cmd.Parameters["@NewId"].Value); conn.Close(); }</code>
Dieser Code ruft den von der gespeicherten Prozedur zurückgegebenen Primärschlüssel erfolgreich ab und gibt ihn aus.
Das obige ist der detaillierte Inhalt vonWie kann ich Ausgabeparameter erfolgreich aus einer gespeicherten SQL Server-Prozedur in C# abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!