Dapper.ContribおよびDynamicParametersで挿入する

c# dapper wpf

質問

質問 :

オブジェクトにパラメータを動的に追加してSQL DBに挿入する巧妙な方法はありますか?

好ましくはDapper


私はアンケートのデータを収集しているWPFアプリケーションを作成しています。私はC#オブジェクトをSQLステートメントにマップするためにDapperを使用しています。

私の問題は、私はそれらの多くを持っているので、私はオブジェクトのプロパティとしてすべての列名をハードコードしたくないということです!

DapperのDynamicParametersを使用して、Dapper.Contrib Insertメソッドを使用してDapperがデータベースに挿入できるオブジェクトを動的に生成したいと考えました。

私はこのような抽象クラスを作った:

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

DynamicParameters.Addメソッドを使用して別のメソッドでパラメータを追加しました。

IDbRecord派生オブジェクトにパラメータを追加すると、 IDbRecordパラメータを挿入しようとします。

この結果は、DynamicParametersのパブリックプロパティを挿入しようとするInsertメソッドと、プライベートparameters DynamicParametersの内容ではありません。 Dapper.ContribのReadmeを見ると意味があります。私は、オブジェクトがDynamicParametersから派生したDynamicParameters parametersを取得するためにInsert()を実装したことを期待していDynamicParameters

人気のある回答

オブジェクトを反復処理し、 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は合法ですか? はい、理由を学ぶ