Autre moyen d'obtenir le paramètre de sortie de la procédure stockée

dapper

Question

J'adore utiliser Dapper pour mes besoins ORM mais je sais qu'il doit y avoir une meilleure façon d'insérer / mettre à jour ma base de données SQL Server en utilisant une procédure stockée et des listes fortement typées.

Par exemple:

J'ai un cours de chanson:

    public class Song
{
    public int Id { get; set; }
    public string title { get; set; }
    public string genre { get; set; }
}

et quelqu'un soumet une liste de chansons:

 List<Song> songs = new List<Song> { 
            new Song { Id = 1, title = "Song 1" , genre="rock"}, 
            new Song { Id = 2, title = "Song 2" , genre="disco"}};

Je veux mettre à jour la base de données en utilisant ma procédure stockée qui insère la nouvelle chanson ou la met à jour si la chanson existe déjà. Ma procédure stockée a deux paramètres de sortie: @success_added int = 0 and @success_updated int = 0

mon sproc est comme suit:

ALTER PROCEDURE [dbo].[UpdateSong] 
@Id int = 0, 
@title varchar(25) = NULL,
@genre varchar(25) = NULL,
@success_updated bit = 0 OUTPUT,
@success_added bit = 0 OUTPUT
AS
IF NOT EXISTS (SELECT Id  FROM Songs WHERE Id = @Id)
    BEGIN
        INSERT INTO Songs
        (
        -- Id created by db
        title,
        genre
        ) 
        VALUES
        (
        @title, 
        @genre
        )
        SELECT @Success_Added = 1, @Success_Updated = 0
    END
ELSE -- song already exists
    BEGIN
        UPDATE Songs  
        SET
        title = @title,
        @genre = @genre
        WHERE Id = @Id
        SELECT @Success_Added = 0, @Success_Updated = 1
    END
RETURN

Je sais que cela fonctionne:

dbConn.Open();
DynamicParameters p = new DynamicParameters();
foreach (var song in songs)
  {
    p.Add("@Id", song.Id);
    p.Add("@title", song.title);
    p.Add("@genre", song.genre);
    p.Add("@success_updated", dbType: DbType.Boolean, direction: ParameterDirection.Output);
    p.Add("@success_added", dbType: DbType.Boolean, direction: ParameterDirection.Output);
    dbConn.Execute("Test_UpdateSong", p, commandType: CommandType.StoredProcedure);
    Console.WriteLine("@success_added: " + p.Get<Boolean>("@success_added"));
    Console.WriteLine("@success_updated: " + p.Get<Boolean>("@success_updated"));
  }
dbConn.Close();

Mais cela nécessite la conversion manuelle de chaque propriété Song en un DynamicParameter de type anonyme. Je préfère simplement faire ceci:

dbConn.Open();
foreach (var song in songs)
  {
    var updateResult = dbConn.Query<dynamic>("Test_UpdateSong", song, commandType: CommandType.StoredProcedure);
  }
dbConn.Close();

Ce qui fonctionne aussi Mais maintenant, comment puis-je obtenir mes paramètres de sortie?

Réponse acceptée

Comme je l'ai indiqué à l'origine, je ne voulais pas avoir à convertir manuellement chaque propriété de classe en paramètre dynamique Dapper. Ceci est essentiel car si je crée une méthode générique, je ne saurai peut-être pas quelle classe est passée dans la méthode et quelles propriétés passer pour la convertir en paramètres dynamiques. En prenant l'avis de @Metro Smurfs (lorsque tout le reste échoue, lisez les instructions), j'ai examiné la classe de test de Dapper et trouvé une solution qui fonctionne pour moi:

DynamicParameters p = new DynamicParameters(song);

En ajoutant l'objet de chanson au constructeur DynamicParameters, un modèle DynamicParameters est créé pour convertir automatiquement toutes les propriétés en paramètres. Ensuite, je peux simplement ajouter mes deux paramètres de sortie et exécuter le sproc:

p.Add("@success_updated", dbType: DbType.Boolean, direction: ParameterDirection.Output);
p.Add("@success_added", dbType: DbType.Boolean, direction: ParameterDirection.Output);
dbConn.Execute("Test_UpdateSong", p, commandType: CommandType.StoredProcedure);
// get my output parameters...
var success_added = p.Get<bool>("@success_Added");
var success_added = p.Get<bool>("@success_Updated");

et je suis bon pour y aller! Merci à @Nick et @Metro Smurf pour les suggestions!




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi