2017-01-11 19 views
0

問題:與Dapper.Contrib和DynamicParameters插入

有一個聰明的方式來動態參數添加到一個對象,並把它們插入到SQL數據庫?

優選使用小巧玲瓏


我正在寫一個WPF應用程序,其中(amongest其他外)我收集問卷的數據。我正在使用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 Dictonary的內容。查看Dapper.Contrib的自述文件時有意義。我只是希望他們已經實施了Insert()來抓取parameters Dictonary,當對象來自DynamicParameters

+0

你試過用Dapper.Contrib或Dapper.Rainbow嗎? – Kiquenet

+0

@Kiquenet,看看這個標題;) 我試圖用'Dapper.Contrib'來做到這一點。我找到了解決辦法。感謝您的關注。 – Smedegaard

回答

0

我重複遍歷了我的對象並構建了一個帶有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; 
    } 

}