使用Dapper.Contrib和DynamicParameters插入

c# dapper wpf

题 :

有没有一种聪明的方法可以动态地向对象添加参数并将它们插入到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 with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因