Maison >développement back-end >C++ >Comment puis-je récupérer avec succès les paramètres de sortie d'une procédure stockée SQL Server en C# ?

Comment puis-je récupérer avec succès les paramètres de sortie d'une procédure stockée SQL Server en C# ?

DDD
DDDoriginal
2025-01-10 09:09:40283parcourir

How Can I Successfully Retrieve Output Parameters from a SQL Server Stored Procedure in C#?

Utilisation des paramètres de sortie de procédure stockée en C#

Question

Le retour des paramètres de sortie d'une procédure stockée SQL Server dans une variable C# peut être difficile. Malgré diverses recommandations, de nombreux développeurs signalent toujours des valeurs nulles ou d'autres problèmes.

Procédure stockée

Considérez la procédure stockée suivante usp_InsertContract, conçue pour insérer un numéro de contrat dans la base de données et renvoyer la clé primaire comme paramètre de sortie :

<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>

Ouvrir la base de données

Ouvrez la connexion à la base de données en utilisant le code suivant :

<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>

Exécuter la commande

Exécutez la procédure stockée en utilisant le code suivant :

<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>

Solution

Utilisez SCOPE_IDENTITY() pour récupérer la clé primaire et apporter quelques modifications à la procédure stockée pour résoudre le problème de valeur nulle :

<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>

Pour utiliser cette procédure stockée modifiée en C#, implémentez le code suivant :

<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>

Ce code récupère et imprime avec succès la clé primaire renvoyée par la procédure stockée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn