Inserción con Dapper.Contrib y DynamicParameters

c# dapper wpf

Pregunta

PREGUNTA:

¿Existe alguna forma inteligente de agregar parámetros dinámicamente a un objeto e insertarlos en un SQL DB?

preferiblemente usando Dapper


Estoy escribiendo una aplicación WPF donde (entre otras cosas) estoy recopilando datos del cuestionario. Estoy usando Dapper para mapear objetos c # a sentencias SQL.

¡Mi problema es que no quiero codificar todos los nombres de las columnas como propiedades de objeto porque tengo muchas de ellas!

Así que quise usar los DynamicParameters de Dapper para generar dinámicamente los objetos que Dapper puede insertar en la base de datos utilizando el método Dapper.Contrib Insert .

Hice una clase abstracta como esta:

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

y agregó parámetros en otro método usando el método DynamicParameters.Add .

Cuando mis parámetros se han agregado a mi objeto derivado IDbRecord , intento insertarlo.

El resultado es el método Insert Inserting que intenta insertar las propiedades públicas de DynamicParameters y no el contenido de los parameters privados Dictonary. Lo cual tiene sentido cuando se mira el archivo Léame de Dapper.Contrib. Solo esperaba que hubieran implementado Insert() para tomar los parameters Dictonary cuando el objeto se derivaba de DynamicParameters .

Respuesta popular

Me esfuerzo iterando a través de mis objetos y construyendo una instrucción SQL INSERT con un StringBuilder . No muy elegante. Pero funciona

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

}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué