Einfügen mit Dapper.Contrib und DynamicParameters

c# dapper wpf

Frage

FRAGE:

Gibt es eine clevere Möglichkeit, einem Objekt dynamisch Parameter hinzuzufügen und sie in eine SQL DB einzufügen?

vorzugsweise mit Dapper


Ich schreibe eine WPF-App, in der (am meisten andere Dinge) ich Fragebogendaten sammle. Ich verwende Dapper, um c # -Objekte SQL-Anweisungen zuzuordnen.

Mein Problem ist, dass ich nicht alle Spaltennamen als Objekteigenschaften fest codieren möchte, da ich viele davon habe!

Daher wollte ich Dapper's DynamicParameters um dynamisch Objekte zu generieren, die Dapper mithilfe der Dapper.Contrib Insert Methode in die Datenbank einfügen kann.

Ich habe eine abstrakte Klasse wie folgt gemacht:

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

und fügte Parameter in einer anderen Methode mithilfe der DynamicParameters.Add Methode hinzu.

Wenn meine Parameter zu meinem IDbRecord abgeleiteten Objekt hinzugefügt wurden, versuche ich es einzufügen.

Dies führt dazu, dass die Insert Methode versucht, die öffentlichen Eigenschaften von DynamicParameters und nicht den Inhalt der privaten parameters Dictonary einzufügen. Was macht Sinn, wenn man sich die Readme von Dapper.Contrib ansieht. Ich hatte nur gehofft, dass sie Insert() implementiert haben, um die parameters DynamicParameters wenn das Objekt von DynamicParameters abgeleitet wurde.

Beliebte Antwort

Ich durchgebe Iteration durch meine Objekte und baue eine SQL INSERT-Anweisung mit einem StringBuilder . Nicht sehr elegant. Aber es funktioniert

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

}


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum