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:
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
Datenbank öffnen
Öffnen Sie die Datenbankverbindung mit dem folgenden Code:
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; }
Befehl ausführen
Führen Sie die gespeicherte Prozedur mit dem folgenden Code aus:
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); }
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:
CREATE PROCEDURE usp_InsertContract @ContractNumber varchar(7), @NewId int OUTPUT AS BEGIN INSERT INTO [dbo].[Contracts] (ContractNumber) VALUES (@ContractNumber); SELECT @NewId = SCOPE_IDENTITY(); END
Um diese geänderte gespeicherte Prozedur in C# zu verwenden, implementieren Sie den folgenden Code:
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(); }
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!