Вставка с помощью Dapper.Contrib и DynamicParameters

c# dapper wpf

Вопрос

ВОПРОС:

Есть ли умный способ динамически добавлять параметры к объекту и вставлять их в SQL DB?

предпочтительно с использованием Dapper


Я пишу приложение WPF, где (среди других вещей) я собираю данные опроса. Я использую Dapper для сопоставления объектов c # с операторами SQL.

Моя проблема в том, что я не хочу жестко кодировать все имена столбцов в качестве свойств объекта, так как у меня их много!

Поэтому я хотел использовать DynamicParameters Dapper для динамического создания объектов, которые Dapper может вставить в базу данных с помощью метода Dapper.Contrib Insert .

Я сделал абстрактный класс следующим образом:

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

и добавлены параметры в другом методе с использованием метода DynamicParameters.Add .

Когда мои параметры были добавлены к моему IDbRecord я пытаюсь его вставить.

Результатом этого является метод Insert medthod, который пытается вставить общедоступные свойства DynamicParameters а не содержимое частных parameters Dictonary. Что имеет смысл, когда смотришь на Readme of Dapper.Contrib. Я просто надеялся, что они внедрили Insert() чтобы захватить parameters Dictonary, когда объект был получен из DynamicParameters .

Популярные ответы

Я пытаюсь выполнить итерацию через мои объекты и создать инструкцию SQL INSERT с помощью StringBuilder . Не очень элегантный. Но это работает

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

}


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему