首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Dapper.Contrib和DynamicParameters插入

用Dapper.Contrib和DynamicParameters插入
EN

Stack Overflow用户
提问于 2017-01-11 14:26:32
回答 1查看 1.1K关注 0票数 0

问题:

是否有一种聪明的方法可以动态地向对象添加参数并将它们插入SQL DB?中?

最好使用Dapper

我正在编写一个WPF应用程序,在那里(最重要的事情之一)我正在收集问卷调查数据。我使用Dapper将c#对象映射到SQL语句。

我的问题是,我不想硬编码所有的列名作为对象属性,因为我有很多!

因此,我想使用Dapper的DynamicParameters动态生成对象,Dapper可以使用Dapper.Contrib Insert方法插入数据库。

我做了这样一个抽象的课程:

代码语言:javascript
复制
public abstract class IDbRecord : DynamicParameters
    {
        [Key]
        public string H4Id { get; set; }
    }

并使用DynamicParameters.Add方法在另一个方法中添加参数。

当我的参数被添加到我的IDbRecord派生对象中时,我尝试插入它。

这个结果是Insert方法,试图插入DynamicParameters的公共属性,而不是私有parameters词典的内容。在查看Dapper.Contrib的自述文件时,这是有意义的。我只是希望当对象从Insert()派生出来时,他们已经实现了parameters来获取parameters字典。

EN

回答 1

Stack Overflow用户

发布于 2017-02-16 11:44:17

我结束了遍历对象和使用StringBuilder构建statement语句的工作。不太优雅。但它很管用

代码语言:javascript
复制
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;
   }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41593422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档