comment renvoyer une valeur intger par objet de requête à l'aide de dapper

c# dapper

Question

Avec la méthode ci-dessous, j'essaye de retourner un intger qui est retourné par une procédure stockée, il retourne la valeur 0 ou plus que zéro. D'après ce que je comprends, lorsque les données sont renvoyées, il s'agira d'un dictionnaire (pas sûr) où j'essaie de retourner un entier. Comment je peux y arriver. Le code ci-dessous est incomplet et le code en commentaire est ce que j'ai fait au début et j'ai réalisé que je pouvais réécrire le même code de manière très simple. Je les ai laissés tous les deux, donc je me trompe, quelqu'un peut me réparer merci.

public int Exists(string plan)
{
    using (var connection = new SqlConnection(Connection))
    {
        connection.Open();
       var parameters = new DynamicParameters();
       //parameters.Add("@Plan", plan, DbType.String,
           //ParameterDirection.Input, null);
           //I guess I can directly pass param but not sure how ??

        var data=connection.Query("storeProcmem_Plan", new{ ? ?},
               CommandType.StoredProcedure);

        //how to return an integer               
        int myvalue= data ???                


        connection.Close();
        return Convert.ToInt32(data);

Réponse d'expert

En supposant que vos paramètres sont fixes (ce qui est généralement le cas pour les procédures stockées - le moment principal pour lequel vous avez besoin de DynamicParameters est que vous générez du SQL sur-le-vol pour correspondre à une requête flexible complexe), l'aspect des paramètres est simple:

new { Plan = plan }

Cela utilise la fonctionnalité de type anonyme du compilateur pour définir que le paramètre doit être nommé Plan , être de type string et avoir la valeur prise dans le plan variables.

Si nous supposons que la procédure stockée select le résultat (plutôt que de return , ce qui doit être codé séparément) dans une seule ligne, la manière la plus simple de lire est:

var myvalue = connection.Query<int>("storeProcmem_Plan", new { Plan = plan },
           CommandType.StoredProcedure).First();

L'API générique vs non générique bascule entre les résultats typés et dynamic résultats dynamic - les deux ont des utilisations, mais <int> semble approprié ici. Le .First() est l’opération LINQ standard qui se traduit par IEnumerable<T> en T en sélectionnant la première valeur (et en lançant une exception s’il n’y en a pas) - vous pouvez également utiliser Single() , FirstOrDefault() ou SingleOrDefault() fonction de la sémantique exacte souhaitée.

Pour être complet, si vous utilisiez l'API non générique, vous devez connaître le nom de la colonne - en gros, ce serait:

dynamic row = connection.Query("storeProcmem_Plan", new { Plan = plan },
       CommandType.StoredProcedure).First();
int myvalue = row.ColumnName;



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