簡體   English   中英

使用Dapper.Contrib和DynamicParameters插入

[英]Inserting with Dapper.Contrib and DynamicParameters

題 :

有沒有一種聰明的方法可以動態地向對象添加參數並將其插入到SQL DB中?

最好使用Dapper


我正在編寫WPF應用,其中(除其他事項外)我正在收集問卷數據。 我正在使用Dapper將c#對象映射到SQL語句。

我的問題是我不想將所有列名都硬編碼為對象屬性,因為我有很多列名!

因此,我想使用Dapper的DynamicParameters動態生成Dapper可以通過使用Dapper.Contrib Insert方法Insert數據庫的對象。

我做了這樣的抽象類:

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

並使用DynamicParameters.Add方法在另一種方法中添加參數。

將我的參數添加到我的IDbRecord派生對象后,我嘗試將其插入。

這是導致在Insert medthod試圖插入的公共屬性DynamicParameters ,而不是私人的內容parameters Dictonary。 在查看Dapper.Contrib的自述文件時,這很有意義。 我只是希望,他們已經實現的Insert()來獲取parameters Dictonary當對象是源自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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM