【问题标题】:Inserting with Dapper.Contrib and DynamicParameters使用 Dapper.Contrib 和 DynamicParameters 插入
【发布时间】:2017-01-11 14:26:32
【问题描述】:

问题:

有没有一种巧妙的方法可以动态地向对象添加参数并将它们插入到 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 方法试图插入DynamicParameters 的公共属性而不是私有parameters 字典的内容。查看 Dapper.Contrib 的自述文件时,这是有道理的。我只是希望当对象派生自DynamicParameters 时,他们已经实现了Insert() 来获取parameters 字典。

【问题讨论】:

  • 您尝试过使用Dapper.ContribDapper.Rainbow 吗?
  • @Kiquenet,看看标题;)我试图用Dapper.Contrib 来做这件事。我找到了解决方法。感谢您的关注。

标签: c# wpf dapper


【解决方案1】:

我最终遍历了我的对象并使用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;
   }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多