Insérer avec Dapper.Contrib et DynamicParameters

c# dapper wpf

Question

QUESTION:

Existe-t-il un moyen astucieux d'ajouter dynamiquement des paramètres à un objet et de les insérer dans une base de données SQL?

en utilisant de préférence Dapper


J'écris une application WPF où (entre autres choses) je collecte des données de questionnaire. J'utilise Dapper pour mapper des objets c # sur des instructions SQL.

Mon problème est que je ne veux pas coder en dur tous les noms de colonnes en tant que propriétés d'objet car j'en ai beaucoup!

Je voulais donc utiliser DynamicParameters de Dapper pour générer dynamiquement des objets que Dapper peut insérer dans la base de données en utilisant la méthode Dapper.Contrib Insert .

J'ai fait un cours abstrait comme ceci:

public abstract class IDbRecord : DynamicParameters
    {
        [Key]
        public string H4Id { get; set; }
    }

et ajouté des paramètres dans une autre méthode à l'aide de la méthode DynamicParameters.Add .

Lorsque mes paramètres ont été ajoutés à mon objet dérivé IDbRecord je tente de l'insérer.

Il en résulte le Insert medthod essayant d'insérer les propriétés publiques de DynamicParameters et non le contenu des parameters privés Dictonary. Ce qui a du sens en regardant le fichier Readme de Dapper.Contrib. J'espérais juste qu'ils avaient implémenté Insert() pour récupérer les parameters Dictonary lorsque l'objet était dérivé de DynamicParameters .

Réponse populaire

J'ai fini par parcourir mes objets et construire une instruction SQL INSERT avec un StringBuilder . Pas très élégant Mais ça marche

if (!hasData)
{
   var parameterList = new StringBuilder(null);
   var valuesList = new StringBuilder(null);
   var insertSql = new StringBuilder(null);
   parameterList.AppendFormat("Id, ");
   valuesList.Append(Id + ", ");
   foreach (var questionBase in answerList)
   {
       if (string.IsNullOrEmpty(questionBase.VariableName))
       {
           throw new ArgumentException("Question " + questionBase.QuestionNumber +
                                       " does not have a VariableName");
       }
       if (!string.IsNullOrEmpty(questionBase.VariableName) && questionBase.Answer != null)
       {
           // insert keys (variable names)
           parameterList.AppendFormat("{0}", questionBase.VariableName);

           if (questionBase.QuestionNumber != answerList.Last().QuestionNumber)
           {
               parameterList.Append(", ");
           }

           // insert values
           valuesList.AppendFormat("{0}", questionBase.Answer);
           if (questionBase.VariableName != answerList.Last().VariableName)
               valuesList.Append(", ");
       }
   }

   try
   {
       insertSql.AppendFormat("INSERT INTO {0} ({1}) VALUES ({2})", tableName, parameterList, valuesList);
       Connect(ConnectionHelper.DevConnString,
           c => c.Execute(insertSql.ToString()));
       return true;
   }
   catch (Exception e)
   {
       return false;
   }

}


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