Inserimento con Dapper.Contrib e DynamicParameters

c# dapper wpf

Domanda

DOMANDA:

Esiste un modo intelligente per aggiungere dinamicamente i parametri a un oggetto e inserirli in un DB SQL?

preferibilmente usando Dapper


Sto scrivendo un'app WPF dove (tra le altre cose) sto raccogliendo i dati del questionario. Sto usando Dapper per mappare oggetti c # su istruzioni SQL.

Il mio problema è che non desidero codificare tutti i nomi delle colonne come proprietà degli oggetti poiché ne ho molti!

Quindi volevo utilizzare Dapper's DynamicParameters per generare dinamicamente oggetti che Dapper può inserire nel database usando il metodo Dapper.Contrib Insert .

Ho creato una classe astratta come questa:

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

e aggiunto parametri in un altro metodo usando il metodo DynamicParameters.Add .

Quando i miei parametri sono stati aggiunti al mio oggetto derivato IDbRecord cerco di inserirlo.

Questo risultato è l' Insert medthod cercando di inserire le proprietà pubbliche DynamicParameters e non il contenuto dei privati parameters Dictonary. Il che ha senso quando si guarda il file Leggimi di Dapper.Contrib. Speravo solo che avessero implementato Insert() per prendere i parameters Dictonary quando l'oggetto era derivato da DynamicParameters .

Risposta popolare

Termino iterando attraverso i miei oggetti e costruendo un'istruzione SQL INSERT con StringBuilder . Non molto elegante. Ma funziona

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

}


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché