Dapper.Contrib 및 DynamicParameters를 사용하여 삽입

c# dapper wpf

문제

문제 :

객체에 매개 변수를 동적으로 추가하고 SQL DB에 삽입하는 영리한 방법이 있습니까?

바람직하게는 Dapper


WPF 앱을 쓰고 있는데, 다른 것들 중에서도 설문지 데이터를 수집하고 있습니다. Dapper를 사용하여 C # 개체를 SQL 문에 매핑합니다.

내 문제는 나는 많은 것들을 가지고 있기 때문에 객체 속성으로서 모든 열 이름을 하드 코딩하고 싶지 않다는 것이다!

그래서 Dapper의 DynamicParameters 를 사용하여 Dapper가 Dapper.Contrib Insert 메서드를 사용하여 데이터베이스에 삽입 할 수있는 객체를 동적으로 생성하려고했습니다.

나는 다음과 같은 추상 클래스를 만들었다 :

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

DynamicParameters.Add 메서드를 사용하여 다른 메서드에서 매개 변수를 추가했습니다.

내 매개 변수를 내 IDbRecord 파생 개체에 추가 할 때이를 삽입하려고합니다.

이 결과는 Insert parametersDynamicParameters 의 공용 속성을 삽입하려고 시도하고 개인 parameters Dictonary의 내용을 삽입하려고 시도하지 않습니다. Dapper.Contrib의 Readme를 볼 때 어떤 의미가 있습니다. 개체가 DynamicParameters 에서 파생되었을 때 Dictonary parameters 를 가져 오기 위해 Insert() 를 구현하기를 바랬습니다.

인기 답변

내 개체를 반복하고 StringBuilder 사용하여 SQL INSERT 문을 작성하는 것을 끝냅니다. 매우 우아하지 않습니다. 그러나 그것은 효과적이다.

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
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.